Matplotlib FuncAnimation para gráfico de dispersión

Estoy tratando de usar el FuncAnimation de Matplotlib para animar la visualización de un punto por cuadro de animación.

 # modules #------------------------------------------------------------------------------ import numpy as np import matplotlib.pyplot as py from matplotlib import animation py.close('all') # close all previous plots # create a random line to plot #------------------------------------------------------------------------------ x = np.random.rand(40) y = np.random.rand(40) py.figure(1) py.scatter(x, y, s=60) py.axis([0, 1, 0, 1]) py.show() # animation of a scatter plot using x, y from above #------------------------------------------------------------------------------ fig = py.figure(2) ax = py.axes(xlim=(0, 1), ylim=(0, 1)) scat = ax.scatter([], [], s=60) def init(): scat.set_offsets([]) return scat, def animate(i): scat.set_offsets([x[:i], y[:i]]) return scat, anim = animation.FuncAnimation(fig, animate, init_func=init, frames=len(x)+1, interval=200, blit=False, repeat=False) 

Desafortunadamente, la ttwig animada final no es lo mismo que la ttwig original. La ttwig animada también muestra varios puntos durante cada fotogtwig de animación. ¿Alguna sugerencia sobre cómo animar correctamente un diagtwig de dispersión utilizando el paquete de animation ?

El único problema con su ejemplo es cómo rellenar las nuevas coordenadas en la función animate . set_offsets espera un Nx2 Nx2 y usted proporciona una tupla de dos arreglos 1d.

Así que solo usa esto:

 def animate(i): data = np.hstack((x[:i,np.newaxis], y[:i, np.newaxis])) scat.set_offsets(data) return scat, 

Y para guardar la animación que quieras llamar:

 anim.save('animation.mp4') 

Descargo de responsabilidad, escribí una biblioteca para intentar hacer esto fácil pero utilizando ArtistAnimation , llamado celuloide . Básicamente, escribe su código de visualización como de costumbre y simplemente toma fotografías después de dibujar cada cuadro. Aquí hay un ejemplo completo:

 import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy as np from celluloid import Camera fig = plt.figure() camera = Camera(fig) dots = 40 X, Y = np.random.rand(2, dots) plt.xlim(X.min(), X.max()) plt.ylim(Y.min(), Y.max()) for x, y in zip(X, Y): plt.scatter(x, y) camera.snap() anim = camera.animate(blit=True) anim.save('dots.gif', writer='imagemgick') 

introduzca la descripción de la imagen aquí