简体   繁体   English

箭头图箭头纵横比

[英]Quiver plot arrow aspect ratio

I am having some issues with Matplotlib's quiver plot. 我在使用Matplotlib的箭袋情节时遇到了一些问题。 Given a velocity vector field, I want to plot the velocity vectors on top of the stream lines. 给定速度矢量场,我想在流线上绘制速度矢量。 The vectors are not tangent to the stream function as expected. 矢量与预期的流函数不相切。

To calculate the stream function, I use a Python translated version of Dr. Pankratov's Matlab code available at http://www-pord.ucsd.edu/~matlab/stream.htm (mine will be available soon at GitHub). 为了计算流函数,我使用了Pankratov博士的Matlab代码的Python翻译版本,可在http://www-pord.ucsd.edu/~matlab/stream.htm获得 (我的很快将在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 produce the following result to illustrate my issues. 产生以下结果来说明我的问题。

任何速度场及其流函数\\ Psi,具有意外纵横比的矢量

Apparently the calculations are fine, but the velocity vectors are not tangent to the stream function, as expected. 显然,计算很好,但速度矢量与流函数不相符,正如预期的那样。 Using the exact save values, Matlab produces a quiver plot that shows exactly what I want. 使用精确的保存值,Matlab会生成一个箭头图,可以准确显示我想要的内容。 In my case, setting the aspect ratio to one gives me the desired result, but forces the axes rectangle to have a specific aspect ratio. 在我的例子中,将宽高比设置为1可以得到所需的结果,但强制轴矩形具有特定的宽高比。

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

I have already unsuccessfully tried different arguments like 'units', 'angles' or 'scale'. 我已经尝试过不同的参数,例如'units','angles'或'scale'。

Does anybody know how to produce quiver plots which adapt to the canvas' aspect ratio and are still tangent to my contour lines, as expected? 是否有人知道如何制作适应画布宽高比并且仍然与我的轮廓线相切的箭头图,如预期的那样?

I expect a result similar as this (note how the vectors are tangent to the stream lines): 我期望得到与此类似的结果(注意向量如何与流线相切): 使用Matlab的任何速度场及其流函数\\ Psi,具有预期纵横比的矢量

Thanks a lot! 非常感谢!

Plot your quiver (doc) using 使用绘制你的箭袋(doc)

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

angles='uv' sets the angle of vector by atan2(u,v) , angles='xy' draws the vector from (x,y) to (x+u, y+v) angles='uv'通过atan2(u,v)设置矢量angles='xy'angles='xy'将矢量从(x,y)绘制到(x+u, y+v)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM