Jupyter Notebook:带有小部件的交互式情节

FLa*_*Lab 19 python matplotlib jupyter 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))
Run Code Online (Sandbox Code Playgroud)

将滑块移动到4.0后,我有:

在此输入图像描述

虽然我只想在移动滑块时改变一个数字.我怎样才能做到这一点?

(我使用的是Python 2.7,matplotlib 2.0,我刚刚更新了笔记本和jupyter到最新版本.如果需要进一步的信息,请告诉我.)

Imp*_*est 24

由于您想要更改图形,而不是创建新图形,我可以建议以下方式:

  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);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或者你也可以plt.show()这个答案中使用.

  • @vestland 我刚刚用 Python 3.6.6、jupyter core 4.4.0、notebook server 5.6.0、jupyter_client 5.2.3、jupyter_console 5.2.0、Ipython 6.5.0、ipywidgets 7.4.2(不确定哪个是相关的)进行了测试,它按预期工作。 (2认同)

Lui*_*ose 5

为了完成这一点,这里有一个答案,它使用多个滑块并设置默认参数以及间隔长度。

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

x = np.linspace(-10, 10,100)

def f(x, A, B, C):
    return A*x**2 + B*x + C

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
line, = ax.plot(x, f(x, A=1, B=1, C=1))

def update(A = 1, B = 0, C = 0):
    line.set_ydata(f(x,A,B,C))
    fig.canvas.draw_idle()
    
interact(update, A = (-4,4,0.1), B = (-4,4,0.1), C = (-4,4,0.1));
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述