環境:Python 2.7、matplotlib 1.3、IPythonノートブック1.1、linux、chrome。コードは--pylab=inline
を使用して1つの入力セルにあります
IPythonノートブックとpandasを使用して、ストリームを消費し、5秒ごとにプロットを動的に更新したいです。
Print文を使用してデータをテキスト形式で印刷するだけで、問題なく動作します。出力セルはデータを印刷し、新しい行を追加し続けるだけです。しかし、データをプロット(およびループで更新)しようとすると、プロットが出力セルに表示されません。しかし、ループを削除する場合は、一度だけプロットします。正常に動作します。
次に、簡単なテストを行いました。
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秒ごとに表示され、更新されるプロットです(または、上で述べたprintステートメントの出力のように、plot()
関数が呼び出されるたびに、うまく機能します)。セルが完全に完了した後に最終チャートを表示するだけでは、私は望みません。
各plot()
などの後に明示的にdraw()関数を追加しようとさえしました。どれも機能しません。 IPythonノートブックの1つのセル内のfor/whileループによってプロットを動的に更新する方法を検討してください。
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
の前に呼び出して、セルが中断されたときに2つではなく1つのプロットになるようにします。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()は現在の図の参照を返します)。
ここに投稿された他のソリューションにラベルを追加すると、すべてのループで新しいラベルが追加され続けます。それに対処するには、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())