Каков текущий правильный способ динамического обновления графиков в Jupyter/iPython?
В ответах на динамическое обновление графика в цикле в ноутбуке ipython (в одной ячейке) приведен пример использования динамического обновления графика внутри ноутбука Jupyter в цикле Python. Однако это работает путем уничтожения и повторного создания графика на каждой итерации и комментария в одном из заметок о том, что эту ситуацию можно улучшить с помощью магии new-ish %matplotlib nbagg
, которая обеспечивает интерактивную фигуру, встроенную в ноутбук, а не статическое изображение.
Однако эта замечательная новая функция nbagg
, насколько мне известно, полностью недокументирована, и я не могу найти пример того, как ее использовать для динамического обновления сюжета. Таким образом, мой вопрос: как эффективно обновить существующий сюжет в ноутбуке Jupyter/Python, используя бэкэнд nbagg?. Поскольку динамическое обновление графиков в matplotlib является сложной проблемой в целом, простой рабочий пример быть огромной помощью. Указатель на любую документацию по этой теме также будет чрезвычайно полезен.
Чтобы понять, о чем я прошу: что я хочу сделать, это запустить некоторый код моделирования для нескольких итераций, затем нарисуйте график его текущего состояния, затем запустите его еще на несколько итераций, а затем обновите для отображения текущего состояния и т.д. Поэтому идея состоит в том, чтобы нарисовать сюжет, а затем, без какого-либо взаимодействия с пользователем, обновить данные на графике, не разрушая и не воссоздавая все это.
Вот несколько слегка модифицированный код из ответа на связанный вопрос выше, который достигает этого путем повторного рисования всей фигуры каждый раз. Я хочу добиться того же результата, но более эффективно использовать 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)
Ответы
Ответ 1
Вот пример, который обновляет график в цикле. Он обновляет данные на рисунке и не перерисовывает всю фигуру каждый раз. Он блокирует выполнение, хотя, если вы заинтересованы в запуске конечного набора симуляций и где-то сохраняете результаты, это может быть не проблемой для вас.
%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)
Я разместил это на nbviewer здесь.
Существует версия IPython Widget версии nbagg
, которая в настоящее время работает в репозитории Matplotlib. Когда это доступно, это, вероятно, будет лучшим способом использования nbagg
.
EDIT: обновлено, чтобы показать несколько графиков