web-dev-qa-db-ja.com

ipythonノートブックのループ内のプロットを動的に更新する方法(1つのセル内)

環境: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ループによってプロットを動的に更新する方法を検討してください。

73
user3236895

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)
98
HYRY

wait=Trueclear_outputに追加すると、これをさらに改善できます。

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

HYRYの答え のいくつかの改善点:

  • displayclear_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
25
Tom Phillips

show()関数の後にgcf().show()またはplot()を追加してみてください。これらは現在の図を強制的に更新します(gcf()は現在の図の参照を返します)。

2

ここに投稿された他のソリューションにラベルを追加すると、すべてのループで新しいラベルが追加され続けます。それに対処するには、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())

0
muon