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实验室的所有后端下都能找到工作。我想检查正确的后端并发出警告是最好的办法。