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

时间:2018-07-30 19:32:14

标签: python matplotlib jupyter-notebook ipywidgets

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

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);

当我每次单击复选框时尝试使用观察功能执行相同的操作时,下面还会显示一个附加图。我需要做些什么才能使其重绘相同的图,使其像上面的示例一样工作?

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

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)

1 个答案:

答案 0 :(得分: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)明确显示该图形。

我假设您希望每次选中此框时都会重新绘制图形,因此我已将其包含在观察功能中。如果您的身材没有变化,则将其移出循环很有意义。


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)