Matplotlib 使用Jupyter笔记本中的按钮更新图形

Matplotlib 使用Jupyter笔记本中的按钮更新图形,matplotlib,jupyter-notebook,widget,Matplotlib,Jupyter Notebook,Widget,我试图模仿使用Jupyter笔记本的小部件以交互方式重新绘制图形。我想介绍的区别是,我生成的图形相当重(计算),所以我希望内核等到我显式地按下“上传按钮”。我已尝试使用以下代码获得此行为: import numpy as np import matplotlib.pyplot as plt import ipywidgets as widgets from IPython.display import display freq = widgets.FloatSlider(min=0, val

我试图模仿使用Jupyter笔记本的小部件以交互方式重新绘制图形。我想介绍的区别是,我生成的图形相当重(计算),所以我希望内核等到我显式地按下“上传按钮”。我已尝试使用以下代码获得此行为:

import numpy as np
import matplotlib.pyplot as plt

import ipywidgets as widgets
from IPython.display import display

freq = widgets.FloatSlider(min=0, value=0.5, max=10.0, step=0.5,description='freq:')
redraw = widgets.Button(description='Redraw',button_style='')

fig, ax = plt.subplots(nrows=1, ncols=1,figsize=(5,3), )

def update(a):
    x = np.linspace(0,10,100)
    y = np.sin(freq.value*x)

    ax.clear()
    plt.plot(x, y)

display(freq, redraw)
redraw.on_click(update)
这或多或少是可行的,但问题是我得到了下图的副本。换言之,该图不会刷新,而是在下面重新显示

我如何才能得到一个适当的刷新的数字,模仿的行为,在我使用的例子


PS:顺便提一下,为什么我需要在函数更新中使用伪参数“a”?否则它似乎不起作用…

回答旁注:matplotlib回调是以
事件作为参数调用的。因此,您的函数签名需要将此事件作为输入,即使您不使用它。(我通常使用
def update(event=None)
来明确说明即使没有传递事件,函数也可以工作。