Usando matplotlib.animation dentro de una función en Canopy

La siguiente secuencia de comandos produce una animación simple de una onda sinusoidal viajera cuando se ejecuta utilizando la instrucción %run en Canopy 1.4.1:

 import numpy as np from matplotlib import pyplot as plt from matplotlib import animation def animator(): fig = plt.figure() ax = plt.axes(xlim=(0, 2), ylim=(-2, 2)) line, = ax.plot([], [], lw=2) def init(): line.set_data([], []) return line, def animate(i): x = np.linspace(0, 2, 1000) y = np.sin(2 * np.pi * (x - 0.01 * i)) line.set_data(x, y) return line, anim = animation.FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=True) plt.show() animator() 

Sin embargo, si quito la última línea, ejecuto el script con %run y call animator() desde el intérprete, solo se dibuja el primer cuadro en la pantalla. ¿Por qué es esto? ¿Cómo puedo obtener una llamada de función para producir una animación dentro de Canopy?

Curiosamente, este problema no se produce en IDLE o en IPython (PyLab), donde llamar a animator() desde el intérprete funciona bien. Además, el problema se limita a la pantalla interactiva: si agrego algunas líneas más al animator para guardar la animación en formato mp4, el archivo mp4 se guarda correctamente incluso desde Canopy.

El código anterior se basa en un tutorial de Jake Vanderplas .

He descubierto una respuesta a la segunda parte de mi pregunta: como se sugiere en esta respuesta , debo tener la función return anim . Pero me siento algo confundido en cuanto a por qué Canopy y los otros intérpretes se comportan de manera diferente aquí. (¿Por qué funcionan IDLE y PyLab?) ¡Cualquier información sería apreciada!