Detener / iniciar / pausar en la animación de python matplotlib

Estoy usando FuncAnimation en el módulo de animación de matplotlib para algunas animaciones básicas. Esta función recorre perpetuamente la animación. ¿Hay alguna forma en que pueda pausar y reiniciar la animación con, por ejemplo, clics del mouse?

Aquí hay un ejemplo de FuncAnimation que modifiqué para pausar con los clics del mouse. Dado que la animación está dirigida por una función de generador, simData , cuando la pause variable global es Verdadero, al producir los mismos datos, la animación aparece en pausa.

El valor de paused se alterna al configurar una callback de evento:

 def onClick(event): global pause pause ^= True fig.canvas.mpl_connect('button_press_event', onClick) 

 import matplotlib.pyplot as plt import numpy as np import matplotlib.animation as animation pause = False def simData(): t_max = 10.0 dt = 0.05 x = 0.0 t = 0.0 while t < t_max: if not pause: x = np.sin(np.pi*t) t = t + dt yield x, t def onClick(event): global pause pause ^= True def simPoints(simData): x, t = simData[0], simData[1] time_text.set_text(time_template%(t)) line.set_data(t, x) return line, time_text fig = plt.figure() ax = fig.add_subplot(111) line, = ax.plot([], [], 'bo', ms=10) ax.set_ylim(-1, 1) ax.set_xlim(0, 10) time_template = 'Time = %.1f s' time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes) fig.canvas.mpl_connect('button_press_event', onClick) ani = animation.FuncAnimation(fig, simPoints, simData, blit=False, interval=10, repeat=True) plt.show() 

Esto funciona…

 anim = animation.FuncAnimation(fig, animfunc[,..other args]) #pause anim.event_source.stop() #unpause anim.event_source.start() 

Combinando las respuestas de @fred y @unutbu aquí, podemos agregar una función onClick después de crear la animación:

 import matplotlib.pyplot as plt import matplotlib.animation as animation fig = plt.figure() def run_animation(): anim_running = True def onClick(event): nonlocal anim_running if anim_running: anim.event_source.stop() anim_running = False else: anim.event_source.start() anim_running = True def animFunc( ...args... ): # Animation update function here fig.canvas.mpl_connect('button_press_event', onClick) anim = animation.FuncAnimation(fig, animFunc[,...other args]) run_animation() 

Ahora podemos simplemente detener o iniciar la animación con clics.

Llegué a esta página intentando implementar la misma funcionalidad, deteniendo la animación de matplotlibs. Las otras respuestas son geniales, pero además quería poder hacer un ciclo manualmente a través de los marcos con las teclas de flecha. Para cualquiera que busque la misma funcionalidad, aquí está mi implementación:

 import matplotlib.pyplot as plt import matplotlib.animation as ani fig, ax = plt.subplots() txt = fig.text(0.5,0.5,'0') def update_time(): t = 0 t_max = 10 while t 

Algunas notas:

  • Para poder modificar los valores de running y direction , los anim a anim . Evita el uso no local (no disponible en Python2.7) o global (no es deseable ya que estoy ejecutando este código dentro de otra función). No estoy seguro de si esto es una buena práctica, pero me pareció bastante elegante.
  • Para la actualización manual, accedo al objeto generador de anim que FuncAnimation usa para actualizar el gráfico. Esto asegura que cuando reanudo la animación, comience desde el marco activo en lugar de desde donde se detuvo originalmente.