2016-03-17 68 views
5

Jupyterノートブックで 'リアルタイム'プロットをしようとしています。 例はhereです。コードは次のとおりです。Jupyterノートブックのインタラクティブプロット

%matplotlib notebook 

import numpy as np 
import matplotlib.pyplot as pl 

from random import randint 
from time import sleep 

from ipywidgets import FloatProgress 
from IPython import display 

siz = 10 
dat = np.zeros((siz, siz)) 

fig = pl.figure() 
axe = fig.add_subplot(111) 
img = axe.imshow(dat) 

num = 1000 

prgBar = FloatProgress(min=0, max=num-1) 
display.display(prgBar) 

for i in range(num): 
    prgBar.value = i 
    pos = (randint(0, siz-1), randint(0, siz-1)) 
    dat[pos] += 1 
    img.set_data(dat) 
    img.autoscale() 
    #sleep(0.01) 

私が目指しているのは、各反復でプロットがどのように変化しているかを見ることです。 私はpl.ion()で対話的なモードを設定しようとしましたが、裏返しをインラインに変更してpl.draw()を呼び出しましたが、それ以外は動作しませんでした。ところで、プログレスバーがうまく働いている...ラデク

+0

完全な対話型バックエンドを提供する '%matplotlib notebook 'を見てください。 – tacaswell

+0

ループとは別のセルで図を作成する必要がありますが、それ以外の場合は機能するはずです。 – tacaswell

+0

私が投稿したリンクを見ると、彼らは別のセルにいることがわかります。 – user2329468

答えて

1

おかげで、次のコードは、トリックを行う必要があります。

import numpy as np 
import matplotlib.pyplot as plt 

from random import randint 
from time import sleep 

from ipywidgets import FloatProgress 
from IPython.display import display, clear_output 

siz = 10 
dat = np.zeros((siz, siz)) 

fig = plt.figure() 
axe = fig.add_subplot(111) 
img = axe.imshow(dat) 

num = 1000 

prgBar = FloatProgress(min=0, max=num-1) 
display(prgBar) 

for i in range(num): 
    clear_output(wait = True) 
    prgBar.value = i 
    pos = (randint(0, siz-1), randint(0, siz-1)) 
    dat[pos] += 1 
    img.set_data(dat) 
    img.autoscale() 
    display(fig) 

を、私は、各ステップに画像を作成するループのために変更してもインポートclear_outputを使用して、各ステップでセル出力をクリーニングします。

+0

これはうまくいきます:1)matplotlibのマジックをインラインに変更する必要があります.2)2番目のプロットを作成します(最初のプロットを省略することができますが、主に3)それはひどく遅くなりますすべて)。だから、それが動作しても、それは最適な方法のように感じることはありません... – user2329468

+1

1)はい:-(、2)これを改善するコードを変更しました。3)パフォーマンスを改善するためにループを修正しました。それは遅いです。私は申し訳ありませんが、私はノートブックでそれを行うためのより良い方法を知らない。最後に、画像を '表示 'して1000の画像を表示し、フロントとバックエンドを1000回通信しています。 'display'ステップは約130msを要し、ループのコードの残りの部分は10msほど多くかかるので、ループの各ステップは約140msです。より良い方法を見つけたらここに投稿してください;-) – kikocorreoso

関連する問題