Python 带有matplotlib的ipywidget图始终显示两个轴

Python 带有matplotlib的ipywidget图始终显示两个轴,python,matplotlib,ipywidgets,Python,Matplotlib,Ipywidgets,我正在尝试创建一个带有matplotlib图形的ipywidget界面,该图形在更改滑块时更新。它在原则上是有效的,但它总是创造一个额外的数字 代码如下: import numpy as np import matplotlib.pyplot as plt from ipywidgets import widgets from IPython.display import display, clear_output # make a grid x = np.linspace(0, 5, 10

我正在尝试创建一个带有
matplotlib
图形的
ipywidget
界面,该图形在更改滑块时更新。它在原则上是有效的,但它总是创造一个额外的数字

代码如下:

import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import widgets
from IPython.display import display, clear_output

# make a grid

x = np.linspace(0, 5, 100)
X, Y = np.meshgrid(x, x)

# create the layout with slider

out = widgets.Output(layout=widgets.Layout(height='300px', width = '400px', border='solid'))
slider = widgets.IntSlider(value=1, min=1, max=5)
w = widgets.VBox(children=(out, slider))

# axes to plot into

ax = plt.axes()

display(w)

def update(value):
    i = slider.value
    Z = np.exp(-(X / i)**2 - (Y / i)**2)
    ax.pcolormesh(x, x, Z, vmin=0, vmax=1, shading='auto')
    with out:
        clear_output(wait=True)
        display(ax.figure)

slider.observe(update)
update(None)
这是不想要的输出


这个小部件工作正常,只更新了上面的输出,但我不明白为什么还存在下面的输出,或者如何摆脱它。我遗漏了一些明显的东西吗?

您可以使用小部件后端,
%matplotlib小部件
,我认为它就是为此而设计的。您需要将
%matplotlib小部件
放在顶部(或者在导入
matplotlib
内容之前)

更新:还添加了一些matplotlib及以下的指导表,强调部分

要获得此处描述的交互功能,必须使用 交互式后端。笔记本电脑中的默认后端,内联 后端,不是backend_inline渲染图形一次并插入 执行单元格时将静态图像输入笔记本。因为 图像是静态的,不能平移/缩放,需要用户输入, 或从其他单元格更新

您的示例可以简化为:

%matplotlib小部件
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从ipywidgets导入小部件
从IPython.display导入显示中,清除\u输出
x=np.linspace(0,5100)
十、 Y=np.meshgrid(X,X)
slider=widgets.IntSlider(值=1,最小值=1,最大值=5)
ax=plt.axs()
显示(滑块)
def更新(值):
i=滑块值
Z=np.exp(-(X/i)**2-(Y/i)**2)
pcolormesh(x,x,Z,vmin=0,vmax=1,shading='auto')
滑块。观察(更新)
更新(无)

jayveesa的答案是避免这种输出的一个非常好的方法。我想在你问题的
为什么
中添加一个答案

这个小部件工作正常,只更新了上面的输出,但我不明白为什么还存在下面的输出,或者如何摆脱它。我错过了什么明显的东西吗

这里要做的一件有益的事情是注释掉更新中显示图形的行


def更新(值):
i=滑块值
Z=np.exp(-(X/i)**2-(Y/i)**2)
pcolormesh(x,x,Z,vmin=0,vmax=1,shading='auto')
#不包括:
#清除输出(等待=真)
#显示器(ax.图)
更新(无)

如果执行此操作,将只看到一个绘图输出。这是因为当您使用jupyter笔记本电脑的
%matplotlib内联
后端时,单元格中创建的任何图形都将在单元格运行完成后关闭并显示。(请参见此处核心matplotlib开发人员的说明:)。因此,被黑色轮廓包围的图形来自
显示屏(ax.figure)
,下方的图形来自先前创建的图形。

谢谢,这确实总是只显示一个图形,但它似乎取决于小部件后端。没有它就不会更新。我在原始帖子中的做法总是显示两个数字,但它似乎在经典笔记本和Jupyter实验室中都能工作,即使不调用小部件后端(但是我已经安装了ipywidgets扩展)。你能澄清一下“没有它,它就不会更新”吗?我希望使用
%matplotlib widget
可以得到一个数字,并且可以使用
滑块进行更新。是的,使用widget后端可以正常工作,如果没有它(例如内联后端),它将无法工作,但也不会引发异常。我希望在笔记本电脑和jupyter实验室的所有后端下都能找到工作。我想检查正确的后端并发出警告是最好的办法。