如何使 ipywidget 按钮更新 matplotlib 图形的特定轴?

How to make a ipywidget button update a specific axis of a matplotlib figure?

如何让 Jupyter notebook 中的 ipywidget 按钮更新特定轴上的绘图?

我已经知道如何在使用单轴时让按钮更新绘图,如下所示:

import ipywidgets as widgets
from IPython.display import display
import matplotlib.pyplot as plt
import numpy as np

btn = widgets.Button(description='Click')
display(btn)

output = widgets.Output()

def on_click_fn(obj):
    output.clear_output()
    values = np.random.rand(10)
    with output:
        plt.plot(values)
        plt.show()

btn.on_click(on_click_fn)
display(output)

在此示例中,单击按钮会更新绘图并显示一组新的 10 个随机点。我认为将其扩展到更新特定轴会很简单,并尝试了以下操作:

import ipywidgets as widgets
from IPython.display import display
import matplotlib.pyplot as plt
import numpy as np

btn = widgets.Button(description='Click')
display(btn)

output = widgets.Output()
fig, ax = plt.subplots(ncols=2)

def on_click_fn(obj):
    output.clear_output()
    values = np.random.rand(10)
    with output:
        ax[0].plot(values)
        plt.show()

btn.on_click(on_click_fn)
display(output)

但是,单击此示例中的按钮似乎没有执行任何操作。我尝试了 adding/removing 和 plt.show() 调用的不同组合,使用 fig.draw() 代替,使用 fig.canvas.draw_idle() 等,但没有太大成功。完成此操作的正确、最不“hacky”的方法是什么?


注意:This question只是关于如何让按钮更新绘图,就像我的第一个例子,而不是让按钮只更新特定的轴。

使用此代码

import ipywidgets as widgets
from IPython.display import display
import matplotlib.pyplot as plt
import numpy as np
%matplotlib widget

btn = widgets.Button(description='Click')
display(btn)

output = widgets.Output()
fig, ax = plt.subplots(ncols=2)

def on_click_fn(obj):
    output.clear_output()
    values = np.random.rand(10)
    with output:
        ax[0].plot(values)
        plt.show()

btn.on_click(on_click_fn)
display(output)

我得到了这个输出