1. ホーム
  2. python

[解決済み] IPython notebookのループでプロットを動的に更新する方法(1セル内)

2022-10-23 04:50:15

質問

環境 Python 2.7です。 Matplotlib 1.3、IPython notebook 1.1、Linux、Chrome。コードは1つの入力セルに --pylab=inline .

IPython notebookと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秒ごとに (または、"co" と "co" の組み合わせで) 表示され、更新されるプロットです。 plot() 関数が呼び出されるたびに、ちょうど私が上で述べたprint文の出力のように、うまく機能します)。セルが完全に終了した後に最終的なグラフを表示するだけでは ではなく であり、私が望むものではありません。

の後に明示的にdraw()関数を追加してみました。 plot() などと書いてみました。どれもうまくいきません。どのようにすれば、プロットを動的に に対して / の間 ループは、IPythonのノートブックで1つのセル内に?

どのように解決するのですか?

を使用します。 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)