Aspect ratio arrows

I have some problems with the Matplotlib quiver schedule. Given the velocity vector field, I want to build velocity vectors on top of the flow lines. The vectors do not relate to the flow function as expected.

To compute the stream function, I use the Python version of Dr. Pankratov’s Matlab code, available at http://www-pord.ucsd.edu/~matlab/stream.htm (mine will be available shortly on GitHub).

Using its results, I use this code:

import numpy import pylab # Regular grid coordineates, velocity field and stream function x, y = numpy.meshgrid(numpy.arange(0, 21), numpy.arange(0, 11)) u = numpy.array([[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], [ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27], [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24], [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]) v = numpy.array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [ -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], [ -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], [ -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], [ -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], [ -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], [ -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [ -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], [ -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]) psi = numpy.array([[ 0. , 0.5, 2. , 4.5, 8. , 12.5, 18. , 24.5, 32. , 40.5, 50. , 60.5, 72. , 84.5, 98. , 112.5, 128. , 144.5, 162. , 180.5, 200. ], [ -9.5, -10. , -9.5, -8. , -5.5, -2. , 2.5, 8. , 14.5, 22. , 30.5, 40. , 50.5, 62. , 74.5, 88. , 102.5, 118. , 134.5, 152. , 170.5], [ -18. , -19.5, -20. , -19.5, -18. , -15.5, -12. , -7.5, -2. , 4.5, 12. , 20.5, 30. , 40.5, 52. , 64.5, 78. , 92.5, 108. , 124.5, 142. ], [ -25.5, -28. , -29.5, -30. , -29.5, -28. , -25.5, -22. , -17.5, -12. , -5.5, 2. , 10.5, 20. , 30.5, 42. , 54.5, 68. , 82.5, 98. , 114.5], [ -32. , -35.5, -38. , -39.5, -40. , -39.5, -38. , -35.5, -32. , -27.5, -22. , -15.5, -8. , 0.5, 10. , 20.5, 32. , 44.5, 58. , 72.5, 88. ], [ -37.5, -42. , -45.5, -48. , -49.5, -50. , -49.5, -48. , -45.5, -42. , -37.5, -32. , -25.5, -18. , -9.5, 0. , 10.5, 22. , 34.5, 48. , 62.5], [ -42. , -47.5, -52. , -55.5, -58. , -59.5, -60. , -59.5, -58. , -55.5, -52. , -47.5, -42. , -35.5, -28. , -19.5, -10. , 0.5, 12. , 24.5, 38. ], [ -45.5, -52. , -57.5, -62. , -65.5, -68. , -69.5, -70. , -69.5, -68. , -65.5, -62. , -57.5, -52. , -45.5, -38. , -29.5, -20. , -9.5, 2. , 14.5], [ -48. , -55.5, -62. , -67.5, -72. , -75.5, -78. , -79.5, -80. , -79.5, -78. , -75.5, -72. , -67.5, -62. , -55.5, -48. , -39.5, -30. , -19.5, -8. ], [ -49.5, -58. , -65.5, -72. , -77.5, -82. , -85.5, -88. , -89.5, -90. , -89.5, -88. , -85.5, -82. , -77.5, -72. , -65.5, -58. , -49.5, -40. , -29.5], [ -50. , -59.5, -68. , -75.5, -82. , -87.5, -92. , -95.5, -98. , -99.5, -100. , -99.5, -98. , -95.5, -92. , -87.5, -82. , -75.5, -68. , -59.5, -50. ]]) # The plots! pylab.close('all') pylab.ion() pylab.figure(figsize=[8, 8]) pylab.contour(x, y, psi, 20, colors='k', linestyles='-', linewidth=1.0) pylab.quiver(x, y, u, v, angles='uv', scale_units='xy', scale=10) ax = pylab.axes() ax.set_aspect(1.) 

to get the following result to illustrate my problems.

Any velocity field and its stream function \ Psi, vectors with unexpected aspect ratio

Apparently, the calculations are excellent, but the velocity vectors are not tangent to the flow function, as expected. Using exact save values, Matlab creates a portion of the quiver that shows exactly what I want. In my case, setting the aspect ratio to one gives me the desired result, but makes the rectangle of the axes have a specific aspect ratio.

 ax = pylab.axes() ax.set_aspect(1.) 

I have already unsuccessfully tried various arguments, such as “units”, “angles” or “scale”.

Does anyone know how to create portions of a quiver that adjust to the proportion of the canvas and still touch my contour lines as expected?

I expect a result similar to this (note how the vectors touch the streamlines): Any velocity field and its stream function \ Psi using Matlab, vectors with expected aspect ratio

Thank you so much!

+8
python matplotlib velocity
source share
1 answer

Place your quiver (doc) using

 pylab.quiver(x, y, u, v, angles='xy', scale_units='xy', scale=10) 

angles='uv' sets the angle of the vector to atan2(u,v) , angles='xy' draws a vector from (x,y) to (x+u, y+v)

+9
source share

All Articles