web-dev-qa-db-ja.com

Jupyter / iPythonでプロットを動的に更新する現在の正しい方法は何ですか?

ipythonノートブック(1つのセル内)のループ内のプロットを動的に更新する方法 に対する回答では、Pythonループ。ただし、これは、反復ごとにプロットを破棄して再作成することで機能し、スレッドの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)
72
Nathaniel

ループ内のプロットを更新する例を次に示します。図のデータを更新し、毎回図全体を再描画するわけではありません。実行をブロックしますが、シミュレーションの有限セットを実行し、結果をどこかに保存することに関心がある場合、それはあなたにとって問題ではないかもしれません。

%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にここに置きました

Matplotlibリポジトリで現在進行中のnbaggのIPythonウィジェットバージョン があります。それが利用できる場合、おそらくそれがnbaggを使用する最良の方法です。

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

53
pneumatics

私はjupyter-labを使用していますが、これは私のために機能します(あなたのケースに合わせて調整してください):

from IPython.display import clear_output
from matplotlib import pyplot as plt
import collections
%matplotlib inline

def live_plot(data_dict, figsize=(7,5), title=''):
    clear_output(wait=True)
    plt.figure(figsize=figsize)
    for label,data in data_dict.items():
        plt.plot(data, label=label)
    plt.title(title)
    plt.grid(True)
    plt.xlabel('Epoch')
    plt.legend(loc='center left') # the plot evolves to the right
    plt.show();

次に、ループで辞書を作成し、live_plot()に渡します。

data = collections.defaultdict(list)
for i in range(100):
    data['foo'].append(np.random.random())
    data['bar'].append(np.random.random())
    data['baz'].append(np.random.random())
    live_plot(data)

プロットの下にいくつかのセルがあることを確認してください。そうしないと、プロットが再描画されるたびにビューがスナップします。

5
Ziofil