Среда: Python 2.7, matplotlib 1.3, IPython notebook 1.1, linux, chrome. Код находится в одной ячейке ввода, используя--pylab=inline
Я хочу использовать блокнот IPython и 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.
источник
clear_output(wait=True)
решает эту проблему. См. Ответ Вабу ниже.%matplotlib nbagg
даст вам живую фигуру, с которой можно поиграть.nbagg
. (Пингует вас, если вы хотите ответить на него.) Stackoverflow.com/questions/34486642/…Вы можете еще больше улучшить, добавив
wait=True
кclear_output
:display.clear_output(wait=True) display.display(pl.gcf())
источник
Несколько улучшений в ответе HYRY :
display
before,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
источник
display.display(gcf())
надо идти ДОdisplay.clear_output(wait=True)
display
раньшеclear_output
? Разве вы не должны сначала очистить вывод, а затем отобразить новые данные, вместо того, чтобы делать это наоборот?Добавление метки к другим решениям, размещенным здесь, будет продолжать добавлять новые метки в каждый цикл. Чтобы справиться с этим, очистите график, используя
clf
for t in range(100) if t % refresh_rate == 0: plt.clf() plt.plot(history['val_loss'], 'r-', lw=2, label='val') plt.plot(history['training_loss'], 'b-', lw=1, label='training') plt.legend() display.clear_output(wait=True) display.display(plt.gcf())
источник
plt.clf()
работает. Однако есть ли способ избавиться от мерцания обновлений?Попробуйте добавить
show()
илиgcf().show()
послеplot()
функции. Это приведет к обновлению текущего рисунка (gcf () возвращает ссылку на текущий рисунок).источник
Вы можете сделать это вот так. Он принимает x, y в качестве списка и выводит график рассеяния плюс линейный тренд на том же графике.
from IPython.display import clear_output from matplotlib import pyplot as plt %matplotlib inline def live_plot(x, y, figsize=(7,5), title=''): clear_output(wait=True) plt.figure(figsize=figsize) plt.xlim(0, training_steps) plt.ylim(0, 100) x= [float(i) for i in x] y= [float(i) for i in y] if len(x) > 1: plt.scatter(x,y, label='axis y', color='k') m, b = np.polyfit(x, y, 1) plt.plot(x, [x * m for x in x] + b) plt.title(title) plt.grid(True) plt.xlabel('axis x') plt.ylabel('axis y') plt.show();
вам просто нужно вызвать
live_plot(x, y)
внутри цикла. Вот как это выглядит:источник