python - graficos - Cómo actualizar la animación de flecha 3D en matplotlib
matplotlib title (2)
Estoy tratando de reproducir el diagrama de la izquierda de esta animación en python usando matplotlib.
Puedo generar las flechas vectoriales usando la función de temblor 3D, pero cuando leo aquí , no parece posible establecer las longitudes de las flechas. Por lo tanto, mi argumento no se ve del todo bien:
Entonces, la pregunta es: ¿cómo puedo generar varias flechas 3D con diferentes longitudes? Es importante destacar que, ¿puedo generarlos de tal manera que pueda modificarlos fácilmente para cada fotograma de la animación?
Aquí está mi código hasta ahora, con el no tan prometedor enfoque de carcaj 3D:
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d
ax1 = plt.subplot(111,projection=''3d'')
t = np.linspace(0,10,40)
y = np.sin(t)
z = np.sin(t)
line, = ax1.plot(t,y,z,color=''r'',lw=2)
ax1.quiver(t,y,z, t*0,y,z)
plt.show()
Como sugiere Azad, una solución poco elegante pero efectiva es simplemente editar mpl_toolkits / mplot3d / axes3d.py para eliminar la normalización. Como no quería meterme con mi instalación real de matplotlib, simplemente copié el archivo axes3d.py en el mismo directorio que mi otra secuencia de comandos y modifiqué la línea
norm = math.sqrt(u ** 2 + v ** 2 + w ** 2)
a
norm = 1
(Asegúrese de cambiar la línea correcta. Hay otro uso de "norma" unas líneas más arriba). Además, para que axes3d.py funcione correctamente cuando está fuera del directorio mpl, cambié
from . import art3d
from . import proj3d
from . import axis3d
a
from mpl_toolkits.mplot3d import art3d
from mpl_toolkits.mplot3d import proj3d
from mpl_toolkits.mplot3d import axis3d
Y aquí está la bonita animación que pude generar (no estoy seguro de qué está pasando con los colores, se ve bien antes de subir a SO).
Y el código para generar la animación:
import numpy as np
import matplotlib.pyplot as plt
import axes3d_hacked
ax1 = plt.subplot(111,projection=''3d'')
plt.ion()
plt.show()
t = np.linspace(0,10,40)
for index,delay in enumerate(np.linspace(0,1,20)):
y = np.sin(t+delay)
z = np.sin(t+delay)
if delay > 0:
line.remove()
ax1.collections.remove(linecol)
line, = ax1.plot(t,y,z,color=''r'',lw=2)
linecol = ax1.quiver(t,y,z, t*0,y,z)
plt.savefig(''images/Frame%03i.gif''%index)
plt.draw()
plt.ioff()
plt.show()
Ahora, si solo pudiera conseguir que esas flechas se vean más bonitas, con lindas cabezas llenas. Pero esa es una pregunta separada ...
EDITAR: en el futuro, matplotlib no normalizará automáticamente las longitudes de flecha en el temblor 3D por esta solicitud de extracción .
Otra solución es llamar ax.quiever
en cada flecha, individualmente, con cada llamada que tenga un atributo de length
propio. Esto no es muy eficiente, pero te pondrá en marcha.
Y no hay necesidad de cambiar el código MPL