notebook - jupyter python 3
¿Cuál es la forma correcta de actualizar dinámicamente las parcelas en Jupyter/iPython? (2)
En las respuestas a
cómo actualizar dinámicamente un diagrama en un bucle en el cuaderno de ipython (dentro de una celda)
, se da un ejemplo de cómo actualizar dinámicamente un diagrama dentro de un cuaderno de Jupyter en un bucle de Python.
Sin embargo, esto funciona destruyendo y recreando la trama en cada iteración, y un comentario en uno de los hilos señala que esta situación puede mejorarse usando la magia new-ish
%matplotlib nbagg
, que proporciona una figura interactiva incrustada en el cuaderno, en lugar de una imagen estática.
Sin embargo, esta nueva característica maravillosa de
nbagg
parece estar completamente indocumentada hasta donde puedo decir, y no puedo encontrar un ejemplo de cómo usarla para actualizar dinámicamente una trama.
Por lo tanto, mi pregunta es,
¿cómo se actualiza eficientemente una trama existente en un cuaderno Jupyter / Python, usando el backend nbagg?
Dado que actualizar dinámicamente las parcelas en matplotlib es un problema complicado en general, un simple ejemplo de trabajo sería de gran ayuda.
Un puntero a cualquier documentación sobre el tema también sería extremadamente útil.
Para que quede claro lo que estoy pidiendo: lo que quiero hacer es ejecutar algún código de simulación para algunas iteraciones, luego dibujar un gráfico de su estado actual, luego ejecutarlo para algunas iteraciones más, luego actualizar el gráfico para reflejar el estado actual, y así sucesivamente. Entonces, la idea es dibujar un diagrama y luego, sin ninguna interacción del usuario, actualizar los datos en el diagrama sin destruir y volver a crear todo.
Aquí hay un código ligeramente modificado de la respuesta a la pregunta vinculada anterior, que logra esto al volver a dibujar la figura completa cada vez.
Quiero lograr el mismo resultado, pero de manera más eficiente usando
nbagg
.
%matplotlib inline
import time
import pylab as pl
from IPython import display
for i in range(10):
pl.clf()
pl.plot(pl.randn(100))
display.display(pl.gcf())
display.clear_output(wait=True)
time.sleep(1.0)
Aquí hay un ejemplo que actualiza una trama en un bucle. Actualiza los datos de la figura y no vuelve a dibujar la figura completa cada vez. Bloquea la ejecución, aunque si está interesado en ejecutar un conjunto finito de simulaciones y guardar los resultados en algún lugar, puede que no sea un problema para usted.
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import time
def pltsin(ax, colors=[''b'']):
x = np.linspace(0,1,100)
if ax.lines:
for line in ax.lines:
line.set_xdata(x)
y = np.random.random(size=(100,1))
line.set_ydata(y)
else:
for color in colors:
y = np.random.random(size=(100,1))
ax.plot(x, y, color)
fig.canvas.draw()
fig,ax = plt.subplots(1,1)
ax.set_xlabel(''X'')
ax.set_ylabel(''Y'')
ax.set_xlim(0,1)
ax.set_ylim(0,1)
for f in range(5):
pltsin(ax, [''b'', ''r''])
time.sleep(1)
Hay una
versión de
nbagg
Widget de
nbagg
que actualmente está en progreso en el repositorio de Matplotlib
.
Cuando eso esté disponible, esa será probablemente la mejor manera de usar
nbagg
.
EDITAR: actualizado para mostrar múltiples parcelas
Estoy usando jupyter-lab y esto funciona para mí (adaptarlo a su caso):
from IPython.display import clear_output
from matplotlib import pyplot as plt
import collections
%matplotlib inline
def live_plot(data_dict, figsize=(7,5), title=''''):
clear_output(wait=True)
plt.figure(figsize=figsize)
for label,data in data_dict.items():
plt.plot(data, label=label)
plt.title(title)
plt.grid(True)
plt.xlabel(''epoch'')
plt.legend(loc=''center left'') # the plot evolves to the right
plt.show();
Luego, en un bucle, completa un diccionario y lo pasa a
live_plot()
:
data = collections.defaultdict(list)
for i in range(100):
data[''foo''].append(np.random.random())
data[''bar''].append(np.random.random())
data[''baz''].append(np.random.random())
live_plot(data)
asegúrese de tener algunas celdas debajo del gráfico, de lo contrario, la vista se ajusta en su lugar cada vez que se vuelve a dibujar el gráfico.