Python Jupyter笔记本:使用ipywidgets时使用的重复散点图

Python Jupyter笔记本:使用ipywidgets时使用的重复散点图,python,matplotlib,jupyter-notebook,ipywidgets,Python,Matplotlib,Jupyter Notebook,Ipywidgets,我试图用复选框控制散点图的显示。当我使用Interactive函数构建它时,它按预期工作。根据复选框中的值显示或隐藏绘图 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()

我试图用复选框控制散点图的显示。当我使用Interactive函数构建它时,它按预期工作。根据复选框中的值显示或隐藏绘图

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);
当我每次点击复选框时都尝试使用观察功能做同样的事情时,我会看到下面显示的另一个图。我需要做什么才能让它重新绘制相同的绘图,使其像上面的示例一样工作

我想interact示例中的某些内容是清除显示,但不清楚如何手动执行此操作

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)

我对你的例子做了一些修改,希望能说明你想要什么。我采取了一种更面向对象的方法,不确定您是否特别想要避免它,但它有助于实现您想要的结果,看起来您正在向一个简单的GUI迈进

1) 包括一个输出小部件(
out
)-基本上是一个单元格输出,可以像普通小部件一样显示。当您想要打印到特定的输出小部件时,可以使用上下文管理器块(
带out:
)。您还可以使用
out.clear\u output()

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

  • 使用plt.ioff()暂时挂起交互式matplotlib
  • 使用
    fig,ax=plt.subplot()
    创建图形和轴。注意:图形可以有多个轴/子图,但我们只需要一个
  • 使用
    ax.scatter(x,y)
    将散布数据“打印”到轴上,但这不会导致它出现
  • 使用
    display(图)
    显式显示图形
我假设您希望每次选中该框时都会重新填充您的图形,因此我已将其包含在观察函数中。如果你的体形没有改变,把它移到圈外是有意义的


导入matplotlib.pyplot作为plt
从ipywidgets导入交互小部件
%matplotlib内联
out=widgets.Output()
x=[1,2,3,4,5,6,7,8]
y=[5,2,4,2,1,4,5,2]
更改时的def(更改):
如果更改['new']==True:
不包括:
plt.ioff()
图,ax=plt.子批次()
最大散射(x,y)
显示器(图)
其他:
out.clear_输出()
cb=widgets.Checkbox(False,description=“Display”)
cb.观察(在更改时,名称=值)
显示器(cb)
显示(输出)