2017-06-02 11 views
4

私はウィジェットに依存するインタラクティブなプロットを生成しようとしています。 私が持っている問題は、スライダを使用してパラメータを変更すると、新しいプロットが前のプロットの後に実行され、代わりにパラメータに応じて1つのプロットしか変更されないことです。Jupyter Notebook:ウィジェットを使ったインタラクティブなプロット

例:

from ipywidgets import interact, interactive, fixed, interact_manual 
import ipywidgets as widgets 

import matplotlib.pyplot as plt 
%matplotlib inline 

import numpy as np 

def plot_func(freq): 
    x = np.linspace(0, 2*np.pi) 
    y = np.sin(x * freq) 
    plt.plot(x, y) 

interact(plot_func, freq = widgets.FloatSlider(value=7.5, 
               min=1, 
               max=5.0, 
               step=0.5)) 

4.0にスライダーを移動した後、私が持っている:

enter image description here

私はちょうど私がスライダーを動かすように、1つの図は、変更したいながら。 これをどうすれば実現できますか?

(Iは、Python 2.7を使用しています、2.0をmatplotlibのと私は最新のバージョンにノートブックとjupyterを更新しました。さらに情報が必要な場合は私に知らせてください。)

答えて

6

あなたは数字を変更すると、代わりに新しいものを作成するには、次の方法を提案してください:

  1. インタラクティブバックエンドを使用してください。 %matplotlib notebook
  2. 新しい図面を描画するのではなく、プロットの線を更新します。

ように、コードは次のようになります:

%matplotlib notebook 
from ipywidgets import * 
import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 2 * np.pi) 
fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1) 
line, = ax.plot(x, np.sin(x)) 

def update(w = 1.0): 
    line.set_ydata(np.sin(w * x)) 
    fig.canvas.draw() 

interact(update); 

enter image description here

代わりにあなたがthis answerのようにplt.show()使用することができます。

2

これは、jupyterおよび/またはipywidgetsの最新バージョンで導入された問題(?)です。私が見つけた1つの回避策は、plot_funcの最後にplt.show()という行を追加することでした。

+0

これは、すべてのシダーアップデートについて新しい数字を作成するでしょうか?だから、それはすべての解決策の中で最も非効率的だと思われますか? – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnestすべてのスライダ更新のために新しい図を作成することは、明らかに効率的ではありません。あなたのアプローチは(+1)です。私はOPの(非効率的な)アプローチへの問題を解決するので、この答えを追加しました。 TBH、私は、この非効率的なアプローチが、関数のプロパティの素早く汚れたビューのためにより便利であることを発見しました。 – Stelios

+0

私は、おそらくあなたは答えにその議論を追加することがわかりますか? – ImportanceOfBeingErnest

関連する問題