Jupyter Notebook:使用ipywidgets时使用的重复散点图

问题描述 投票:2回答:1

我正试图用复选框控制散点图的显示。当我使用交互功能构建它时,它按预期工作。根据复选框中的值显示或隐藏图表。

import matplotlib.pyplot as plt
from ipywidgets import interact, widgets
%matplotlib inline

def on_change(Display):
    if Display == True:
        plt.scatter(x,y)
        plt.show()  
    return Display

interact(on_change, Display=False);

每当我点击复选框时,当我尝试使用observe功能执行相同的操作时,我会在下面显示另一个图表。我需要做些什么来重绘相同的情节,以便它像上面的例子一样工作?

我想交互示例中的某些内容正在清除显示,但不清楚如何手动执行此操作。

import matplotlib.pyplot as plt
from ipywidgets import interact, widgets
%matplotlib inline

x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]

def on_change(change):
    if change['new'] == True:
        scat = plt.scatter(x,y)
        plt.show()   

cb = widgets.Checkbox(False, description = "Display")
cb.observe(on_change, names='value')
display(cb)
python matplotlib jupyter-notebook ipywidgets
1个回答
1
投票

我对你的例子进行了一些改动,希望能够展示你想要的东西。我采取了更加面向对象的路线,不确定你是否特别想避免它,但它有助于实现你想要的结果,看起来你正在朝着一个简单的GUI迈进。

1)包含一个输出小部件(out) - 基本上是一个单元格输出,您可以像普通小部件一样显示。当您要打印到特定输出窗口小部件时,可以使用上下文管理器块(with out:)。您还可以使用out.clear_output()清除小部件

2)在matplotlib中使用面向对象的接口而不是使用plt。我发现这更容易控制显示哪些图以及在适当的时间在哪个位置。

  • 用plt.ioff()临时暂停交互式matplotlib
  • 使用fig, ax = plt.subplots()创建您的图形和轴。 NB数字可以有多个轴/子图,但我们只需要一个。
  • 使用ax.scatter(x,y)将散射数据“绘制”到您的轴,但这不会导致它出现。
  • 使用display(fig)显式显示图形。

我假设您希望每次选中复选框时重新绘制图形,所以我将它包含在observe函数中。如果你的数字没有改变,那么将它移到循环之外是有意义的。


import matplotlib.pyplot as plt
from ipywidgets import interact, widgets
%matplotlib inline

out = widgets.Output()

x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]

def on_change(change):
    if change['new'] == True:
        with out:
            plt.ioff()
            fig,ax = plt.subplots()
            ax.scatter(x,y)
            display(fig)
    else:
        out.clear_output()

cb = widgets.Checkbox(False, description = "Display")
cb.observe(on_change, names='value')
display(cb)
display(out)
© www.soinside.com 2019 - 2024. All rights reserved.