【问题标题】:Jupyter Notebook: duplicated scatter plot using when using ipywidgetsJupyter Notebook:使用 ipywidgets 时使用的重复散点图
【发布时间】:2019-01-07 02:56:59
【问题描述】:

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

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)

【问题讨论】:

    标签: python matplotlib jupyter-notebook ipywidgets


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2017-10-04
      • 2016-05-01
      • 1970-01-01
      • 2019-11-01
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 2018-05-29
      相关资源
      最近更新 更多