plot - tiempo - Gráficos animados en cuaderno ipython
graficos 2d python (8)
En el comentario de @goger de ''horrible parpadeo'', encontré que llamar a clear_output (wait = True) resolvió mi problema. La bandera le dice a clear_output que espere para renderizar hasta que tenga algo nuevo que renderizar.
¿Hay alguna forma de crear gráficos animados? Por ejemplo mostrando la misma gráfica, con diferentes parámetros.
Por ejemplo, es el cuaderno SAGE, uno puede escribir:
a = animate([circle((i,i), 1-1/(i+1), hue=i/10) for i in srange(0,2,0.2)],
xmin=0,ymin=0,xmax=2,ymax=2,figsize=[2,2])
a.show()
Esto tiene un parpadeo horrible, pero al menos esto crea una trama que me anima. Se basa en el de Aron, pero el de Aron no funciona como está.
import time, sys
from IPython.core.display import clear_output
f, ax = plt.subplots()
n = 30
x = array([i/10.0 for i in range(n)])
y = array([sin(i) for i in x])
for i in range(5,n):
ax.plot(x[:i],y[:i])
time.sleep(0.1)
clear_output()
display(f)
ax.cla() # turn this off if you''d like to "build up" plots
plt.close()
Si quieres animaciones de gráficos de dispersión 3D, el widget Ipyvolume Jupyter es muy impresionante. http://ipyvolume.readthedocs.io/en/latest/animation.html#
Si usa la notebook IPython, v2.0 y superior son compatibles con widgets interactivos . Puede encontrar un buen cuaderno de ejemplo here (nb debe descargar y ejecutar desde su propia máquina para ver los controles deslizantes).
Básicamente se reduce a importar, interact
y luego pasarle una función, junto con rangos para los parámetros. por ejemplo, desde el segundo enlace:
In [8]:
def pltsin(f, a):
plot(x,a*sin(2*pi*x*f))
ylim(-10,10)
In [9]:
interact(pltsin, f=(1,10,0.1), a=(1,10,1));
Esto producirá un gráfico con dos controles deslizantes, para f
y a
.
bqplot es una muy buena opción para hacer esto ahora. Está construido específicamente para la animación a través de Python en el cuaderno.
Los widgets de IPython le permiten manipular objetos de Python en el kernel con objetos de GUI en el Notebook. Puede que también te guste Sage albergó los portátiles IPython . Un problema que podría tener al compartir widgets o interactividad en los portátiles es que si alguien más no tiene IPython, no puede ejecutar su trabajo. Para resolverlo, puede usar Domino para compartir portátiles con widgets que otros pueden ejecutar.
A continuación, se incluyen tres ejemplos de widgets que puede crear en un Cuaderno utilizando pandas para filtrar datos, fractales y un control deslizante para un gráfico 3D. Obtenga más información y vea el código y los cuadernos here .
Si desea transmitir en vivo los datos o configurar una simulación para que se ejecute como un bucle, también puede transmitir datos en gráficos en un cuaderno. Descargo de responsabilidad: trabajo para Plotly.
matplotlib
tiene un módulo de animation
para hacer precisamente eso. Sin embargo, los ejemplos proporcionados en el sitio no se ejecutarán como en un cuaderno; Necesitas hacer algunos ajustes para que funcione.
Este es el ejemplo de la página siguiente modificada para trabajar en un cuaderno (modificaciones en negrita ).
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib import rc
from IPython.display import HTML
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], ''ro'', animated=True)
def init():
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1, 1)
return ln,
def update(frame):
xdata.append(frame)
ydata.append(np.sin(frame))
ln.set_data(xdata, ydata)
return ln,
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
init_func=init, blit=True)
rc(''animation'', html=''html5'')
ani
# plt.show() # not needed anymore
Tenga en cuenta que la animación en el cuaderno se realiza a través de una película y que necesita tener instalado ffmpeg y matplotlib configurado para usarlo.
Actualización: enero 2014
Jake Vanderplas ha creado un paquete basado en JavaScript para animaciones matplotlib disponible here . Su uso es tan simple como:
# https://github.com/jakevdp/JSAnimation
from JSAnimation import examples
examples.basic_animation()
Ver su blog para una descripción más completa y ejemplos. Respuesta histórica (ver goger para una corrección)
Sí, la actualización de Javascript todavía no contiene correctamente el marco de la imagen, así que hay parpadeo, pero puedes hacer algo bastante simple usando esta técnica:
import time, sys
from IPython.display import clear_output
f, ax = plt.subplots()
for i in range(10):
y = i/10*sin(x)
ax.plot(x,y)
time.sleep(0.5)
clear_output()
display(f)
ax.cla() # turn this off if you''d like to "build up" plots
plt.close()