2017-04-05 34 views
3
%matplotlib inline 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib as mpl 
from ipywidgets import interact, FloatSlider, RadioButtons 

amplitude_slider = FloatSlider(min=0.1, max=1.0, step=0.1, value=0.2) 
color_buttons = RadioButtons(options=['blue', 'green', 'red']) 
# decorate the plot function with an environment from the UIs: 
@interact(amplitude=amplitude_slider, color=color_buttons) 
def plot(amplitude, color): 
    fig, ax = plt.subplots(figsize=(4, 3), 
         subplot_kw={'axisbg':'#EEEEEE', 
            'axisbelow':True}) 

    ax.grid(color='w', linewidth=2, linestyle='solid') 
    x = np.linspace(0, 10, 1000) 
    ax.plot(x, amplitude * np.sin(x), color=color, 
     lw=5, alpha=0.4) 
    ax.set_xlim(0, 10) 
    ax.set_ylim(-1.1, 1.1) 

使用这个小工具多次让我多路输出:ipywidgets + matplotlib不能清除旧输出

enter image description here

什么我需要在代码更新这样的情节每次清除小部件用来?

回答

2

我想可能有两个问题:

  1. 首先是创建一个新的人物,每个互动元素被更新的时间轴。所以这个新数字将被追加。
  2. 其次,您正在使用%matplotlib inline,它显示图的图像。所以一旦情节改变,一个新的图像将被显示,而不是当前改变的图像。

一个选项可能是使用%matplotlib notebook后端。

然后,人们可以创建一个图形并绘制一些初始值。我们还需要保留对艺术家的引用,这些引用应该由小部件进行更新。

一旦完成,交互式图形似乎与交互式小部件发生冲突。为了解决这个问题,我把所有的交互小部件(包括他们的导入)放在图中下方的一个新单元中。

我不确定发生这种情况的原因,但以下似乎是一个工作解决方案。

进口

%matplotlib notebook 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib as mpl 

创建图形,绘制的初始行

fig, ax = plt.subplots(figsize=(4, 3), 
         subplot_kw={'facecolor':'#EEEEEE', 
            'axisbelow':True}) 
ax.grid(color='w', linewidth=2, linestyle='solid') 
x = np.linspace(0, 10, 1000) 
line, = ax.plot(x, 0.2 * np.sin(x), color="blue", 
    lw=5, alpha=0.4) 
ax.set_xlim(0, 10) 
ax.set_ylim(-1.1, 1.1) 

最后,在一个新的单元格,执行交互,只更新艺术家,而不是重新创建。

from ipywidgets import interact, FloatSlider, RadioButtons 
amplitude_slider = FloatSlider(min=0.1, max=1.0, step=0.1, value=0.2) 
color_buttons = RadioButtons(options=['blue', 'green', 'red']) 
# decorate the plot function with an environment from the UIs: 
@interact(amplitude=amplitude_slider, color=color_buttons) 
def plot(amplitude, color): 
    y = amplitude * np.sin(x) 
    line.set_ydata(y) 
    line.set_color(color) 

下面是它的外观形象。

enter image description here