matrices graficos graficas graficar grafica encimar crear coordenadas con como python matplotlib pandas ipython ipython-notebook

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 de clear_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)