2012-08-22 35 views
8

我有Matplotlib顫抖情節的一些問題。給定速度矢量場,我想繪製流線頂部的速度矢量。預期的矢量與流函數不相切。顫抖情節箭頭長寬比

要計算流函數,我使用Dr.Pankratov的Matlab代碼的Python翻譯版本,可在http://www-pord.ucsd.edu/~matlab/stream.htm(我的GitHub即將發佈)。

使用它的結果,我用這個代碼:

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.) 

產生以下結果來說明我的問題。

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

顯然的計算都很好,但速度矢量不相切到流功能,符合市場預期。使用確切的保存值,Matlab產生一個顫動圖,顯示我想要的。在我的情況下,將寬高比設置爲1會給我想要的結果,但強制矩形軸具有特定的高寬比。

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

我已經嘗試過不同的參數,比如'units','angles'或者'scale'。

是否有人知道如何產生適應畫布縱橫比並且仍然與我的輪廓線相切的顫抖圖,如預期的那樣?

我期待,因爲這類似的結果(注意向量如何切向流線): Any velocity field and its stream function \Psi using Matlab, vectors with expected aspect ratio

非常感謝!

回答

9

情節就是箭囊(doc)使用

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

angles='uv'設置載體由atan2(u,v)角度,angles='xy'吸引了來自(x,y)的載體(x+u, y+v)

+0

非常感謝您!我覺得我應該嘗試更多的選擇。 – regeirk