ipywidgets + matplotlib 无法清除旧输出

jay*_*ode 5 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)
Run Code Online (Sandbox Code Playgroud)

多次使用该小部件给了我多个输出:

在此输入图像描述

我需要在代码中更新什么,以便每次使用小部件时都会清除绘图?

Imp*_*est 4

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

  1. 第一个是每次更新交互元素时创建一个新的图形和轴。因此,将附加这个新数字。
  2. 其次,您使用的是%matplotlib inline,它显示绘图的图像。因此,一旦绘图发生更改,就会显示一张新图像,而不是当前更改的图像。

一种选择可能是使用%matplotlib notebook后端。

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

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

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

进口

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
Run Code Online (Sandbox Code Playgroud)

创建图形,绘制初始线

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

最后,在一个新的单元格中进行交互,仅更新艺术家,而不重新创建它们。

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

这是它的外观图像。

在此输入图像描述