【问题标题】:ipywidgets + matplotlib cannot clear old outputsipywidgets + matplotlib 无法清除旧输出
【发布时间】:2017-08-30 10:40:00
【问题描述】:
%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)

多次使用小部件让我得到了多个输出:

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

【问题讨论】:

    标签: matplotlib jupyter-notebook ipywidgets


    【解决方案1】:

    我认为可能有两个问题:

    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)
    

    这是它的外观图片。

    【讨论】:

      猜你喜欢
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 2016-11-13
      • 1970-01-01
      • 2019-06-13
      • 2019-01-20
      相关资源
      最近更新 更多