graficos - cómo actualizar dinámicamente un gráfico en un bucle en el cuaderno ipython(dentro de una celda)
matplotlib python (4)
Entorno: Python 2.7, matplotlib 1.3, IPython notebook 1.1, Linux, Chrome. El código está en una sola celda de entrada, usando --pylab=inline
Quiero usar el cuaderno y los pandas IPython para consumir un flujo y actualizar dinámicamente el trazado cada 5 segundos.
Cuando uso print statement para imprimir los datos en formato de texto, funciona perfectamente bien: la celda de salida solo sigue imprimiendo datos y agregando nuevas filas. Pero cuando trato de trazar los datos (y luego actualizarlos en un bucle), el gráfico nunca aparece en la celda de salida. Pero si elimino el bucle, solo traza una vez. Funciona bien.
Luego hice una prueba simple:
i = pd.date_range(''2013-1-1'',periods=100,freq=''s'')
while True:
plot(pd.Series(data=np.random.randn(100), index=i))
#pd.Series(data=np.random.randn(100), index=i).plot() also tried this one
time.sleep(5)
La salida no mostrará nada hasta que interrumpa manualmente el proceso (ctrl + m + i). Y después de que lo interrumpo, la trama se muestra correctamente como múltiples líneas superpuestas. Pero lo que realmente quiero es una trama que se muestre y se actualice cada 5 segundos (o cada vez que se llame a la función plot()
, al igual que los resultados de las declaraciones impresas que mencioné anteriormente, que funcionan bien). Solo mostrar el cuadro final después de que la celda está completamente hecha NO es lo que quiero.
Incluso traté de agregar explícitamente la función draw () después de cada plot()
, etc. Ninguno de ellos funciona. Me pregunto cómo actualizar dinámicamente un trazado mediante un ciclo for / while dentro de una celda en el cuaderno IPython.
Intenta agregar show()
o gcf().show()
después de la función plot()
. Esto obligará a la figura actual a actualizar (gcf () devuelve una referencia para la figura actual).
Puede mejorar esto añadiendo wait=True
a clear_output
:
display.clear_output(wait=True)
display.display(pl.gcf())
Un par de mejoras en la respuesta de HYRY :
-
display
llamada después declear_output
para que termine con un gráfico, en lugar de dos, cuando se interrumpe la celda. - atrapa
KeyboardInterrupt
, de modo que la salida de la celda no esté llena de traceback.
import matplotlib.pylab as plt
import pandas as pd
import numpy as np
import time
from IPython import display
%matplotlib inline
i = pd.date_range(''2013-1-1'',periods=100,freq=''s'')
while True:
try:
plt.plot(pd.Series(data=np.random.randn(100), index=i))
display.display(plt.gcf())
display.clear_output(wait=True)
time.sleep(1)
except KeyboardInterrupt:
break
use el módulo IPython.display
:
%matplotlib inline
import time
import pylab as pl
from IPython import display
for i in range(10):
pl.plot(pl.randn(100))
display.clear_output(wait=True)
display.display(pl.gcf())
time.sleep(1.0)