Подтвердить что ты не робот

Каков текущий правильный способ динамического обновления графиков в 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)
4b9b3361

Ответ 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: обновлено, чтобы показать несколько графиков