2017-06-02 157 views
4

我想要生成一个交互式绘图,取决于小部件。 我遇到的问题是,当我使用滑块更改参数时,会在前一个之后完成一个新的绘图,而我预计只有一个绘图会根据参数进行更改。Jupyter笔记本:与小部件交互式绘图

例子:

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

,而我只是想一个数字改变,因为我移动滑块。 我该如何做到这一点?

(我使用Python 2.7,matplotlib 2.0和我刚刚更新的笔记本电脑和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

或者您可以使用plt.show()this answer

2

这是在最新版本的jupyter和/或ipywidgets中引入的一个问题(?)。我找到的一种解决方法是在plot_func的末尾添加行plt.show()

+0

这将为每个更新的傻瓜创建一个新的数字,对吧?那么,这似乎是所有解决方案中效率最低的? – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest为每个滑块更新创建一个新图形显然效率不高。你的方法是(+1)。我只是增加了这个答案,因为它解决了OP的(低效)方法的问题。 TBH,我发现这种效率低下的方法对于快速和肮脏的功能属性视图更加方便。 – Stelios

+0

我明白了,也许你将这个论点加入了答案? – ImportanceOfBeingErnest