Tengo algunos problemas con el diagrama de temblor de Matplotlib. Dado un campo de vector de velocidad, quiero trazar los vectores de velocidad en la parte superior de las líneas de flujo. Los vectores no son tangentes a la función de flujo como se esperaba.Parcela de tizón, relación de aspecto de flecha
Para calcular la función de la secuencia, utilizo una versión traducida de Python del código Matlab del Dr. Pankratov disponible en http://www-pord.ucsd.edu/~matlab/stream.htm (la mía estará disponible pronto en GitHub).
Usando sus resultados, utilizo este código:
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.)
para producir el siguiente resultado para ilustrar mis problemas.
Al parecer, los cálculos están bien, pero los vectores de velocidad no son tangentes a la función de corriente, como se esperaba. Utilizando los valores de guardado exactos, Matlab produce un diagrama de temblor que muestra exactamente lo que quiero. En mi caso, establecer la relación de aspecto en uno me da el resultado deseado, pero obliga al rectángulo de los ejes a tener una relación de aspecto específica.
ax = pylab.axes()
ax.set_aspect(1.)
Ya he intentado sin éxito diferentes argumentos como 'unidades', 'ángulos' o 'escala'.
¿Alguien sabe cómo producir gráficos de temblor que se adaptan a la relación de aspecto del lienzo y siguen siendo tangentes a mis líneas de contorno, como se esperaba?
que esperar un resultado similar a este (observar cómo los vectores son tangentes a las líneas de corriente):
Muchas gracias!
Muchas gracias! Siento que debería haber intentado con más opciones. – regeirk