Note: This uses carpet plots and axis constraints, both of which are forthcoming but currently-unreleased plotly.js features
In particular, it uses the analytical solution for incompressible potential flow over a cylinder. Then, since the flow obeys the Cauchy-Riemann equations (i.e. can be stated as a complex analytic function), it can be transformed with a conformal map since conformal maps preserve angles. In partiular, the Kármán-Trefftz transform pulls of the remarkable feat of transforming a cylinder into an airfoil, more or less. The rest is just details.
✈️