ipywidgets + matplotlib无法清除旧输出

时间:2017-04-05 02:07:01

标签: matplotlib jupyter-notebook ipywidgets

%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)

多次使用小部件可以获得多个输出:

enter image description here

我需要在代码中更新什么才能在每次使用窗口小部件时清除绘图?

1 个答案:

答案 0 :(得分:3)

我认为可能存在两个问题:

  1. 首先,每次更新交互式元素时都会创建一个新的图形和轴。所以这个新的数字将被追加。
  2. 其次,您正在使用显示情节图像的%matplotlib inline。因此,一旦更改了绘图,将显示一个新图像,而不是当前更改的图像。
  3. 选项可能是使用%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