python 3.x - Animación en el cuaderno de iPython
python-3.x animation (4)
Algunas opciones que tiene para animar tramas en Jupyter / IPython, usando matplotlib:
-
Uso de la
display
en bucle UseIPython.display.display(fig)
para mostrar una figura en la salida. Con un bucle, querrá borrar la salida antes de que se muestre una nueva figura. Tenga en cuenta que esta técnica da en general resultados no tan suaves. Por lo tanto, recomendaría usar cualquiera de los siguientes.import matplotlib.pyplot as plt import matplotlib.animation import numpy as np from IPython.display import display, clear_output t = np.linspace(0,2*np.pi) x = np.sin(t) fig, ax = plt.subplots() l, = ax.plot([0,2*np.pi],[-1,1]) animate = lambda i: l.set_data(t[:i], x[:i]) for i in range(len(x)): animate(i) clear_output(wait=True) display(fig) plt.show()
-
%matplotlib notebook
Utilice el%matplotlib notebook
mágico de IPython para configurar el backend en el backend del cuaderno. Esto mantendrá viva la figura en lugar de mostrar un archivo png estático y, por lo tanto, también puede mostrar animaciones.
Ejemplo completo:%matplotlib notebook import matplotlib.pyplot as plt import matplotlib.animation import numpy as np t = np.linspace(0,2*np.pi) x = np.sin(t) fig, ax = plt.subplots() l, = ax.plot([0,2*np.pi],[-1,1]) animate = lambda i: l.set_data(t[:i], x[:i]) ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t)) plt.show()
-
%matplotlib tk
Utilice IPython magic%matplotlib tk
para establecer el backend en el backend tk. Esto abrirá la figura en una nueva ventana de trazado, que es interactiva y, por lo tanto, también puede mostrar animaciones.
Ejemplo completo:%matplotlib tk import matplotlib.pyplot as plt import matplotlib.animation import numpy as np t = np.linspace(0,2*np.pi) x = np.sin(t) fig, ax = plt.subplots() l, = ax.plot([0,2*np.pi],[-1,1]) animate = lambda i: l.set_data(t[:i], x[:i]) ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t)) plt.show()
-
Convierta la animación a video mp4 (opción mencionada por @Perfi ya):
from IPython.display import HTML HTML(ani.to_html5_video())
o use
plt.rcParams["animation.html"] = "html5"
al comienzo del cuaderno. Esto requerirá tener códecs de video ffmpeg disponibles para convertir a video HTML5. El video se muestra en línea. Por lo tanto, esto es compatible con el backend en%matplotlib inline
. Ejemplo completo:%matplotlib inline import matplotlib.pyplot as plt plt.rcParams["animation.html"] = "html5" import matplotlib.animation import numpy as np t = np.linspace(0,2*np.pi) x = np.sin(t) fig, ax = plt.subplots() l, = ax.plot([0,2*np.pi],[-1,1]) animate = lambda i: l.set_data(t[:i], x[:i]) ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t)) ani
%matplotlib inline import matplotlib.pyplot as plt import matplotlib.animation import numpy as np t = np.linspace(0,2*np.pi) x = np.sin(t) fig, ax = plt.subplots() l, = ax.plot([0,2*np.pi],[-1,1]) animate = lambda i: l.set_data(t[:i], x[:i]) ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t)) from IPython.display import HTML HTML(ani.to_html5_video())
-
Convertir animación a JavaScript :
from IPython.display import HTML HTML(ani.to_jshtml())
o use
plt.rcParams["animation.html"] = "jshtml"
al comienzo del cuaderno. Esto mostrará la animación como HTML con JavaScript. Esto es altamente compatible con la mayoría de los navegadores nuevos y también con el backend en%matplotlib inline
. Está disponible en matplotlib 2.1 o superior.
Ejemplo completo:%matplotlib inline import matplotlib.pyplot as plt plt.rcParams["animation.html"] = "jshtml" import matplotlib.animation import numpy as np t = np.linspace(0,2*np.pi) x = np.sin(t) fig, ax = plt.subplots() l, = ax.plot([0,2*np.pi],[-1,1]) animate = lambda i: l.set_data(t[:i], x[:i]) ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t)) ani
%matplotlib inline import matplotlib.pyplot as plt import matplotlib.animation import numpy as np t = np.linspace(0,2*np.pi) x = np.sin(t) fig, ax = plt.subplots() l, = ax.plot([0,2*np.pi],[-1,1]) animate = lambda i: l.set_data(t[:i], x[:i]) ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t)) from IPython.display import HTML HTML(ani.to_jshtml())
Estoy tratando de poner animaciones en un cuaderno de iPython y no encuentro una solución. Vi una publicación que discutía el uso de widgets interactivos, pero hay un par de problemas que tengo con esto: primero, cada ejemplo que veo con widgets usa un control deslizante o alguna otra entrada, mientras que solo quiero que la animación se ejecute automáticamente cuando la celda se corre. En segundo lugar, toda la documentación parece desactualizada en el sitio de Jupyter: cada vez que descargo y ejecuto sus cuadernos recibo estos mensajes acerca de que ciertos módulos están en desuso y luego, en el archivo, algo no se ejecuta, presumiblemente porque están tratando de importar y acceder a archivos que ya no existen.
He visto algunas otras páginas sobre el tema, pero a menudo requieren la descarga de binarios u otros módulos, pero en parte lo estoy usando para enseñar matemáticas a algunos estudiantes y he conseguido que descarguen Anaconda; esperaba no seguir confundir el problema al hacer que también descarguen e instalen cosas más complicadas, todo mientras pasan tiempo sin hablar de las matemáticas.
En resumen, ¿hay alguna forma de crear animaciones en un portátil iPython que solo requiera el uso de comandos de importación simples que se ejecutarán de manera inmediata, por así decirlo, con el software que viene de Anaconda?
[Editar: también debo tener en cuenta que he usado Tkinter para hacer animaciones, y podría hacer una en matplotlib, estoy seguro. Entonces, si hubiera una forma de obtener las animaciones que produce con las que se representan en una computadora portátil iPython, esa sería una solución funcional para mí.]
[Edición adicional: supongo que también podría decir lo que espero animar en este momento, aunque realmente quiero ser bastante flexible sobre la gama de cosas que podría animar si así lo decido. En este momento estoy tratando de hacer un reloj digital que muestre cada dígito en números sumerios de base 60 para ilustrar un sistema de conteo y base diferente. Por lo tanto, debería mostrar inicialmente | luego, después de un segundo || y así sucesivamente hasta que diez se represente como <y así sucesivamente hasta que finalmente el reloj pase a un minuto donde ahora se muestra |: | para representar un minuto, un segundo.]
Los widgets Jupyter son una buena forma de mostrar animaciones. El siguiente código muestra un gif animado .....
from ipywidgets import Image
from IPython import display
animatedGif = "animatedGifs/01-progress.gif" #path relative to your notebook
file = open(animatedGif , "rb")
image = file.read()
progress= Image(
value=image,
format=''gif'',
width=100,
height=100)
display.display(progress)
Puedes cerrar esta animación usando:
progress.close()
NB Encontré algunos buenos gifs animados de http://www.downgraf.com/inspiration/25-beautiful-loading-bar-design-examples-gif-animated/ .
Tuve un problema similar y esta pregunta me ayudó a comenzar. Creé un cuaderno que ilustra el uso de FuncAnimation junto con buenas explicaciones de por qué el cuaderno hace algunas cosas de la manera en que lo hace. También tiene enlaces a instrucciones sobre FFmpeg. También tiene enlaces a los ejemplos que utilicé para desarrollar y comprender las animaciones. Puedes ver mi contribución en: Ilustración de animación
Para su pregunta, puede encontrar los controles deslizantes interactivos como una herramienta mejor. También creé un cuaderno que muestra widgets interactivos en Jupyter. Está disponible here ; sin embargo, las partes interactivas no funcionan allí.
Ambos están disponibles en un repositorio de GitHub
Puede encontrar este tutorial interesante.
Si puede convertir lo que necesita en una animación matplotlib, y de acuerdo con su descripción estoy bastante seguro de que es posible, puede usar
from matplotlib import rc, animation
rc(''animation'', html=''html5'')
y muestra tu animación usando
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=N, interval=20, blit=True)
anim
¡Podría ser útil!