web-dev-qa-db-ja.com

Jupyter Notebook:ウィジェットを使用したインタラクティブなプロット

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

例:

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つだけ変わります。どうすればこれを達成できますか?

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

19
FLab

新しい図を作成する代わりに、図を変更したいので、次の方法をお勧めします。

  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_idle()

interact(update);
_

enter image description here

または、 this answer のようにplt.show()を使用することもできます。

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

2
Stelios