Animación de matplotlib: el primer fotogtwig permanece en el canvas cuando se utiliza blit

Estoy tratando de trazar dos elipses rotativos usando la biblioteca de animación de Matplotlib, y logré que funcionara (más o menos). El problema es que el primer fotogtwig que se está renderizando no se actualiza, así que mientras tengo dos elipses rotativas en mi canvas, también tengo las elipses en su posición / orientación original. Echa un vistazo a mi simple pieza de código:

import matplotlib.pyplot as plt from matplotlib.patches import Ellipse from matplotlib import animation fig = plt.figure() ax = fig.add_subplot(111, aspect='equal') e1 = Ellipse(xy=(0.5, 0.5), width=0.5, height=0.2, angle=60) e2 = Ellipse(xy=(0.8, 0.8), width=0.5, height=0.2, angle=100) def init(): ax.add_patch(e1) ax.add_patch(e2) return [e1,e2] def animate(i): e1.angle = e1.angle + 0.5 e2.angle = e2.angle + 0.5 return [e1,e2] anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, blit=True) plt.show() 

¿Algúna idea de cómo arreglar esto? Por supuesto, podría apagar blit, pero eso lo hace terriblemente lento, por lo que no es realmente una opción.

EDITAR: Código final (de trabajo)

 import matplotlib.pyplot as plt from matplotlib.patches import Ellipse from matplotlib import animation fig = plt.figure() ax = fig.add_subplot(111, aspect='equal') e1 = Ellipse(xy=(0.5, 0.5), width=0.5, height=0.2, angle=60) e2 = Ellipse(xy=(0.8, 0.8), width=0.5, height=0.2, angle=100) ax.add_patch(e1) ax.add_patch(e2) def init(): e1.set_visible(False) e2.set_visible(False) return [e1,e2] def animate(i): if i == 1: e1.set_visible(True) e2.set_visible(True) e1.angle = e1.angle + 0.5 e2.angle = e2.angle + 0.5 return [e1,e2] anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, blit=True) plt.show() 

Prueba esto:

 import matplotlib.pyplot as plt from matplotlib.patches import Ellipse from matplotlib import animation fig = plt.figure() ax = fig.add_subplot(111, aspect='equal') e1 = Ellipse(xy=(0.5, 0.5), width=0.5, height=0.2, angle=60) e2 = Ellipse(xy=(0.8, 0.8), width=0.5, height=0.2, angle=100) def init(): return [ax] def animate(i): if i==0: ax.add_patch(e1) ax.add_patch(e2) e1.angle = e1.angle + 0.5 e2.angle = e2.angle + 0.5 return [e1,e2] anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, blit=True) plt.show() 

Captura de pantalla que muestra el comportamiento correcto.

Pruebe este otro enfoque (no solo he usado una elipse para las pruebas, también se ve bien aquí):

 import matplotlib.pyplot as plt from matplotlib.patches import Ellipse from matplotlib import animation fig = plt.figure() ax = fig.add_subplot(111, aspect='equal') e1 = Ellipse(xy=(0.5, 0.5), width=0.5, height=0.2, angle=60) ax.add_patch(e1) def init(): e1.set_visible(False) return e1, def animate(i): if i==0: e1.set_visible(True) e1.angle = e1.angle + 0.5 return e1, anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, blit=True) plt.show() 

La respuesta propuesta parece un hack. Estás ocultando el parche para un fotogtwig, y ​​luego lo muestras al siguiente, sin rima ni razón. Además, noté que se llama a la función init cada vez que cambia el tamaño de la ttwig, lo que haría que la elipse fuera invisible después de cambiar el tamaño con la solución propuesta.

Creo que la forma correcta de hacer esto es establecer animated=True en los objetos de Ellipse . Ver la documentación de la animación matplotlib . Aquí hay un código que me funciona:

 import matplotlib.pyplot as plt from matplotlib.patches import Ellipse from matplotlib import animation fig = plt.figure() ax = fig.add_subplot(111, aspect='equal') e1 = Ellipse(xy=(0.5, 0.5), width=0.5, height=0.2, angle=60, animated=True) e2 = Ellipse(xy=(0.8, 0.8), width=0.5, height=0.2, angle=100, animated=True) ax.add_patch(e1) ax.add_patch(e2) def init(): return [e1, e2] def animate(i): e1.angle = e1.angle + 0.5 e2.angle = e2.angle + 0.5 return [e1, e2] anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, blit=True) plt.show()