Me gustaría crear una animación con matplotlib en python. Como la película de animación de datos está en función de dos parámetros (tiempo, número de cuerpos) tengo una idea para el uso de 2 bucles. El código es el siguiente:

import time
import matplotlib as mpl
from matplotlib import pyplot as plt
from matplotlib import pylab as plb

#   set up figure for plotting:
fig = plt.figure()
ax = fig.add_subplot(111)

#    plot limits
ax.set_xlim(-(max(q0) + bodies[-1].L), +(max(q0) + bodies[-1].L))
ax.set_ylim(-(max(q0) + bodies[-1].L), +(max(q0) + bodies[-1].L))

#    colors
colors = ['b', 'g', 'c']


for i_t in range(0, np.shape(t)[1]):    #t is an one column matrix
    for i in range(0, N):
        ax.plot(x_matrix[i_t, i], y_matrix[i_t, i], 's', color=colors[i])
    plt.draw()
plt.show()

El problema es que el código que me genera una parcela pero con todas animadas puntos. Me gustaría tener la animación ploted para un valor de tiempo (contador i_t) y todos los cuerpos (contador i) en una ventana, como una película por lo que la anterior parcela se borra en el siguiente paso de tiempo.

He cambiado el código sugerido para:

for i_t in range(0, np.shape(t)[1]):
    for i in range(0, N):
        ax.clear()
        ax.plot(x_matrix[i_t, i], y_matrix[i_t, i], 's', color=colors[i])
        plt.pause(0.001)
plt.draw()

Pero luego me sale un error:

C:\Python27\lib\site-packages\matplotlib\backend_bases.py:2292:
MatplotlibDeprecationWarning: por defecto Utilizando el bucle de eventos hasta que la función
específica para esta GUI es implementado advertencias.warn(str,
mplDeprecation)

Que no es tan aterrador, pero cuando se ejecuta el código de los puntos que tendría que ser planeado juntos (contador i) se trazan aparte por lo que se ve como blinkig puntos (si sabes a lo que me refiero).

Cualquier sugerencia. Creo que estoy cerca de la solución, pero todavía necesita la finishig toque para que el código funcione. Espero que esto se puede hacer de la manera que me imaginaba así yo no tendría que solucionar el problema con un enfoque diferente.

  • usted tiene que usar el show comando para cada i_t supongo. Tenga en cuenta que la trama de todas las cosas en exactamente una (!) gráfico de su código. Tal vez usted debe comprobar la matplotlib libro de cocina para las animaciones: scipy.org/Cookbook/Matplotlib/Animations o si desea una película, (probablemente sí), verifique lo siguiente: debtechandstuff.blogspot.de/2009/10/… por lo General, usted tiene que trazar cada fotograma en su propio y, a continuación, hacer que la animación fuera de él. Una película de dibujos animados .gif es bastante fácil de hacer.
  • Usted puede ignorar la advertencia.
  • funcionará mejor si usted acaba de reemplazar los datos con set_data, en lugar de soplar el conjunto de los ejes de distancia en cada fotograma.
InformationsquelleAutor lskrinjar | 2013-06-03

2 Comentarios

  1. 3

    Me han resuelto el problema. La solución es (si alguien la va a necesitar):

    for i_t in range(0, np.shape(t)[1]):
        ax.clear()
        plt.hold(True)
        #    plot limits
        ax.set_xlim(-(max(q0) + bodies[-1].L), +(max(q0) + bodies[-1].L))
        ax.set_ylim(-(max(q0) + bodies[-1].L), +(max(q0) + bodies[-1].L))
        for i in range(0, N):
            ax.plot(x_matrix[i_t, i], y_matrix[i_t, i], 's', color=colors[0, i])
    
        plt.pause(0.0001)

    Me habría publicado earlyer, sino como un nuevo usuario tuve que esperar 8 horas para responder a mi propia pregunta.

    • Traté de plt.pause(). El problema es que se cierra después de completar la trama. ¿Cómo puedo evitar esto?
    • Intente cambiar el valor en plt.pause() de 0.0001 0.1? Es plt.pause() la sangría interior (segundo) for bucle?
  2. 2

    Cambiar la última sección del código a este:

    for i_t in range(np.shape(t)[1]):    #t is an one column matrix
        for i in range(N):
            ax.clear()
            ax.plot(x_matrix[i_t, i], y_matrix[i_t, i], 's', color=colors[i])
            plt.pause(0.001)
    # eof

    Adaptar la velocidad de la animación al cambiar el número en plt.pause(0.001).

Dejar respuesta

Please enter your comment!
Please enter your name here