как динамически обновлять график в цикле в ноутбуке ipython (в одной ячейке)

Окружающая среда: Python 2.7, matplotlib 1.3, IPython notebook 1.1, linux, chrome. Код находится в одной входной ячейке, используя --pylab=inline

Я хочу использовать IPython notebook и pandas для потребления потока и динамического обновления графика каждые 5 секунд.

Когда я просто использую оператор печати для печати данных в текстовом формате, он отлично работает: выходная ячейка только сохраняет печать данных и добавляет новые строки. Но когда я пытаюсь построить данные (а затем обновить их в цикле), сюжет никогда не появится в выходной ячейке. Но если я удалю цикл, просто зарисуйте его один раз. Он работает нормально.

Затем я сделал несколько простых тестов:

 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) 

Выход ничего не покажет, пока я вручную не прерываю процесс (ctrl + m + i). И после того, как я прерываю его, график корректно отображается как несколько перекрывающихся строк. Но то, что я действительно хочу, – это сюжет, который появляется и обновляется каждые 5 секунд (или всякий раз, когда вызывается функция plot() , точно так же, как и выходы, упомянутые выше, которые работают хорошо). Показывать только окончательный график после того, как ячейка полностью выполнена, НЕ является тем, что я хочу.

Я даже попытался явно добавить функцию draw () после каждого plot() и т. Д. Ни один из них не работает. Удивительно, как динамически обновлять график с помощью цикла for / while в одной ячейке в ноутбуке IPython.

4 Solutions collect form web for “как динамически обновлять график в цикле в ноутбуке ipython (в одной ячейке)”

используйте модуль 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) 

Вы можете улучшить это, добавив wait=True в clear_output :

 display.clear_output(wait=True) display.display(pl.gcf()) 

Несколько улучшений на ответ HYRY :

  • вызывать display после clear_output так что вы закончите с одним clear_output , а не с двумя, когда ячейка будет прервана.
  • поймайте KeyboardInterrupt , так что выход ячейки не засорится трассировкой.
 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 

Попробуйте добавить show() или gcf().show() после функции plot() . Они заставят текущий показатель обновиться (gcf () возвращает ссылку для текущего рисунка).

  • Как использовать функции Pandas roll_ * на перспективной основе
  • Замена части строки в python pandas dataframe
  • Как переместить столбец в Pandas DataFrame
  • Применение функции в нескольких столбцах для создания нескольких новых столбцов
  • Логарифмическая доходность в рамке данных pandas
  • Как перенести данные pandas из индекса в столбец после нескольких групп
  • Как выбрать последний столбец данных
  • Как вы строите вертикальную линию на графике временного ряда в Пандах?
  • Преобразование строк в float в DataFrame
  • получить список из столбца dataframe pandas
  • Переименовать Pandas DataFrame Index
  • Python - лучший язык программирования в мире.