2012-08-22 2 views
8

Matplotlib의 떨림 음영에 몇 가지 문제가 있습니다. 속도 벡터 필드가 주어진다면, 나는 유선을 유선 위에 깔고 싶습니다. 벡터는 예상대로 스트림 함수에 접하지 않습니다.떨림 플롯 화살표 종횡비

스트림 함수를 계산하려면 http://www-pord.ucsd.edu/~matlab/stream.htm에서 사용할 수있는 Pankratov 박사 MATLAB 코드의 Python 번역 버전을 사용합니다 (광산은 곧 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.) 

은 이미 실패 '단위', '각도'또는 '규모'와 같은 다른 인수를 시도했다.

캔버스의 종횡비에 적응하고 예상대로 내 윤곽선에 여전히 접하는 떨림 플롯을 만드는 방법을 아는 사람이 있습니까? Any velocity field and its stream function \Psi using Matlab, vectors with expected aspect ratio

고마워 :

나는이 유사한 결과 (벡터 스트림 라인에 접하는 방법 참고)을 기대!

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

angles='uv'를 사용

답변

9

플롯 당신의 화살통 (doc)atan2(u,v)에 의한 벡터의 각도를 설정하고, angles='xy' 매우 감사 (x+u, y+v)

+0

(x,y)에서 벡터를 그립니다! 더 많은 옵션을 시도해야한다고 생각합니다. – regeirk