2017-11-06 19 views
1

DSP講義用の一連のインタラクティブノートブックを作成し始めました。今のところ、&をコピーしてMWEを貼り付けることができました。しかし、アニメーションを含むmatplotlib Figureに加えて、私は常に空のMatplotlibウィンドウを取得しています。任意のアイデアはどのようにこの動作を抑制する?JupyterノートブックのMatplotlibアニメーションが空のプロットを追加作成

パイソン:3.6.3 matplotlibの:2.0と2.1 IPython:5.3.0 OS:勝利7 64ビット

%matplotlib inline 
import numpy as np 
import matplotlib.pyplot as plt 

from matplotlib import animation 
from IPython.display import HTML 

plt.rcParams['figure.figsize'] = (5,3) 
plt.rcParams['figure.dpi'] = 100 
plt.rcParams['savefig.dpi'] = 100 
plt.rcParams["animation.html"] = "jshtml" # for matplotlib 2.1 and above, uses JavaScript 
#plt.rcParams["animation.html"] = "html5" # for matplotlib 2.0 and below, converts to x264 using ffmpeg video codec 
t = np.linspace(0,2*np.pi) 
x = np.sin(t) 

fig, ax = plt.subplots() 
ax.axis([0,2*np.pi,-1,1]) 
l, = ax.plot([],[]) 

def animate(i): 
    l.set_data(t[:i], x[:i]) 

ani = animation.FuncAnimation(fig, animate, frames=len(t)) 
ani 

ノートも下で観察することができる。

https://github.com/chipmuenk/dsp_fpga/blob/master/notebooks/01_LTI/MWE_animation.ipynb

githubの静的レンダリングでは、JavaScriptアニメーションではなく空のプロットウィンドウのみが表示されます。

+0

マジック '%matplotlib inline'を削除するか、代わりに'%matplotlib agg'を使用してください。 – Goyo

+0

私はさまざまなバックエンドを試しましたが、問題は、学生がログインしてブラウザとやりとりする仮想サーバー上でノートブックが動作することです。私にとっては、出力を1つのウィンドウに制限するのが最もクリーンな解決策でした。 – Chipmuenk

+0

両方の回避策では、すべてがブラウザに表示されますが、空の図は表示されません。 – Goyo

答えて

1

これはアニメーションとは関係ありません。

ライン

%matplotlib inline 
import matplotlib.pyplot as plt 
fig, ax = plt.subplots() 

は空の数字で出力を作成します。

%%captureを使用して、ジュピターノートブックのセルの出力を防ぐことができます。

セル1:

%%capture 
%matplotlib inline 
import matplotlib.pyplot as plt 
import matplotlib.animation 
plt.rcParams["animation.html"] = "jshtml" 
import numpy as np 

t = np.linspace(0,2*np.pi) 
x = np.sin(t) 

fig, ax = plt.subplots() 
h = ax.axis([0,2*np.pi,-1,1]) 
l, = ax.plot([],[]) 

def animate(i): 
    l.set_data(t[:i], x[:i]) 

ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t)) 

セル2:ここ

ani 

enter image description here

+0

ニート! %%のキャプチャをサーフィンしているときに別の解決策が見つかりました: fig、ax = plt.subplots() plt.close(); も私のためのトリックでした。明らかに、プロットを閉じることによって、 'fig'と' ax'へのハンドルは削除されません。 1つまたは他のソリューションを好む理由はありますか? – Chipmuenk

+0

いいえ、両方のソリューションが動作する理由は実際には同じです。プロットは閉じています。次のセルに移動するか、すでにセル内で閉じています。より好きな方法を選択してください。 – ImportanceOfBeingErnest

0

代替例である:

%matplotlib inline 
from matplotlib import animation, pyplot as plt 
import numpy as np 
plt.rc('animation', html='html5') 

data = np.random.random(20) 
fig = plt.figure() 

ax = fig.add_subplot(111) 
ax.plot(data) # draw background 

anim = animation.ArtistAnimation(fig, [[ax.scatter(x, y)] for x, y in enumerate(data)]) 
anim 

結果(anim)アニメーション化されて表示されますが、潜在的な副作用は静的フレームの追加表示です。この副作用は、add_subplotメソッドの前に別のセルでplt.figure呼び出しが発生した場合に消えます。

これは、新しいフィギュアを作成すると、スタティックイメージ(ノートブックの現在のセル評価の終わりにフィギュアがどのように残っているかを示す)が表示されるという副作用を引き起こすためです(ImportanceOfBeingErnestと同様です)。しかし、図にまだ何も配置されていない場合(軸でさえも)、画像が表示されないようにすることができます(これを抑止するための魔法の必要はありません)。

+0

もう一つの選択肢は '%matplotlib inline'を完全に省略するか、それが実行可能でない場合は直ちに**アニメーションを意図したFigureが作成された後**を繰り返すことです。これは、そうでなければセル結果の一部ではない静的な数字を表示する魔法をリセットします。アニメーション自体は、(セル評価結果のhtmlフォーマットを含む)全く異なるメカニズムによって表示されています。 – benjimin

関連する問題