【问题标题】:How to make a ipywidget button update a specific axis of a matplotlib figure?如何使 ipywidget 按钮更新 matplotlib 图形的特定轴?
【发布时间】:2023-03-23 07:20:01
【问题描述】:

如何让 Jupyter 笔记本中的 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)

但是,单击此示例中的按钮似乎没有任何作用。我尝试了添加/删除plt.show()调用的不同组合,改用fig.draw(),使用fig.canvas.draw_idle()等,但没有取得多大成功。完成此任务的正确、最少“hacky”方式是什么?


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

【问题讨论】:

  • 我不明白这个问题。无论有没有plt.show(),第二个代码都可以正常工作。第一个代码缺少fig, ax = plt.subplots(),但也可以正常工作。这不是你想要达到的输出吗?
  • 在我的机器中,第二个代码不起作用。它产生两个子图,但单击按钮不会更新其中一个以显示新的随机数。您是否尝试按原样运行第二个代码并在您的机器上运行?
  • 它对我有用,因为我无法在评论中附加任何图像,我将其作为答案,之后我将删除它(因为它不是答案)。跨度>

标签: python matplotlib jupyter-notebook ipywidgets


【解决方案1】:

使用此代码

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)

我得到了这个输出

【讨论】:

  • 有趣。按钮在哪里?如果单击它,它是否会更新左侧的轴并显示新数字?另外,为什么情节中有四行,而不是单行?是按几次按钮后的输出吗?
  • 我想我理解这个问题。您在上面的代码中列出的导入是您拥有的完整导入吗?您还需要 %matplotlib widget 以及 jupyter 中的交互部分(或者我实际上是否离您的实际问题更远?)
  • 按钮就在图的正上方,我裁剪了屏幕截图,是的,我点击了 4 次以确保它可以正常工作;)
  • 啊,卡琳娜。我想我们现在互相理解了!不,我的代码中没有 %matplotlib 小部件。我会尝试添加它并回复答案。
  • 是的,添加%matplotlib widget(并安装软件包)确实解决了这个问题。也许您可以编辑您的答案以包含它,我会将其标记为正确? :)
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多