1. ホーム
  2. python

[解決済み] Jupyter/iPythonでプロットを動的に更新するために現在正しい方法は何ですか?

2022-10-22 23:14:48

質問

の回答では ipython notebookでループ内のプロットを動的に更新する方法(1つのセル内)。 の回答で、Pythonのループ内でJupyterノートブック内のプロットを動的に更新する方法の例が挙げられています。しかし、これは反復毎にプロットを破壊して再作成することで動作します。スレッドの1つのコメントで、この状況は新しいスタイルの %matplotlib nbagg マジックで、静的な画像ではなく、ノートブックに埋め込まれたインタラクティブな図を提供することで、この状況を改善できることを、あるスレッドのコメントは指摘しています。

しかし、この素晴らしい新しい nbagg 機能は、私が知る限りでは完全に文書化されていないようで、プロットを動的に更新するためにそれを使用する方法の例を見つけることができません。そこで質問です。 nbaggバックエンドを使用して、Jupyter/Pythonノートブック内の既存のプロットを効率的に更新するにはどうしたらよいでしょうか? matplotlibでプロットを動的に更新することは一般的に難しい問題なので、簡単な作業例があれば非常に助かります。このトピックに関するあらゆる文書へのポインタもまた、非常に有用でしょう。

私がやりたいことは、いくつかのシミュレーションコードを数回実行し、現在の状態をプロットし、さらに数回実行し、現在の状態を反映するためにプロットを更新し、といったようなことです。つまり、プロットを描き、その後、ユーザーからのインタラクションなしに、全体を破壊して再作成することなくプロットのデータを更新することなのです。

ここに、上記のリンクされた質問に対する回答から若干修正されたコードがあります。これは、毎回図全体を再描画することによってこれを達成します。私は同じ結果を達成したいのですが、より効率的に nbagg .

%matplotlib inline
import time
import pylab as pl
from IPython import display
for i in range(10):
    pl.clf()
    pl.plot(pl.randn(100))
    display.display(pl.gcf())
    display.clear_output(wait=True)
    time.sleep(1.0)

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

ループでプロットを更新する例です。これは図中のデータを更新し、毎回図全体を再描画するわけではありません。有限回のシミュレーションを行い、結果をどこかに保存することに興味があるのであれば、問題ないかもしれませんが、実行はブロックされます。

%matplotlib notebook

import numpy as np
import matplotlib.pyplot as plt
import time

def pltsin(ax, colors=['b']):
    x = np.linspace(0,1,100)
    if ax.lines:
        for line in ax.lines:
            line.set_xdata(x)
            y = np.random.random(size=(100,1))
            line.set_ydata(y)
    else:
        for color in colors:
            y = np.random.random(size=(100,1))
            ax.plot(x, y, color)
    fig.canvas.draw()

fig,ax = plt.subplots(1,1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xlim(0,1)
ax.set_ylim(0,1)
for f in range(5):
    pltsin(ax, ['b', 'r'])
    time.sleep(1)

nbviewerに載せたのはここです。

がありますが、これは の IPython Widget 版があります。 nbagg これは現在 Matplotlib リポジトリで進行中です。 . これが利用可能になれば、おそらくこれが nbagg .

EDIT: 複数のプロットを表示するように更新