【发布时间】:2014-09-17 15:49:05
【问题描述】:
我想使用 ipython notebook 小部件为内联 matplotlib 图添加一定程度的交互性。
一般来说,情节可能很繁重,我只想更新情节的特定元素。我知道小部件具有内置的节流功能,有助于不淹没内核,但是当情节需要 30 秒时,我不想等待这么长时间来更新一行。
通过阅读example notebooks,我能够创建一个基本示例,其中我向 mpl 轴添加了一个十字光标(由 2 个滑块驱动)。
问题是图形显示了两次。这是代码(单元格 1):
fig, ax = plt.subplots()
ax.plot([3,1,2,4,0,5,3,2,0,2,4])
...显示的图...,单元格 2(编辑:感谢 Thomas K 的改进):
vline = ax.axvline(1)
hline = ax.axhline(0.5)
def set_cursor(x, y):
vline.set_xdata((x, x))
hline.set_ydata((y, y))
display(fig)
最后(单元格 3):
interact(set_cursor, x=(1, 9, 0.01), y=(0, 5, 0.01))
再次显示带有小部件的图形。
所以问题是:
- 如何禁止第一个数字显示?
- 这是正确的方法还是有更好的方法?
编辑
我发现了一个 ipython 配置旋钮,根据this notebook,它允许禁止图形显示
%config InlineBackend.close_figures = False
虽然示例笔记本有效,但我不知道如何单独使用此选项(没有链接示例中提供的上下文管理器类)来隐藏图形显示。
编辑 2
我发现some documentation 中的InlineBackend.close_figures 是可配置的。
编辑 3
由@shadanan 回答触发,我想澄清一下,我的目的是将光标添加到现有图形中,而不是在每次光标移动时从头开始重新绘制绘图。将 3 个单元格合并为一个单元格:
fig, ax = plt.subplots()
ax.plot([3,1,2,4,0,5,3,2,0,2,4])
vline = ax.axvline(1)
hline = ax.axhline(0.5)
def set_cursor(x, y):
vline.set_xdata((x, x))
hline.set_ydata((y, y))
display(fig)
interact(set_cursor, x=(1, 9, 0.01), y=(0, 5, 0.01))
它“应该”工作,但它没有。第一次执行单元格时,它显示 2 个数字。小部件交互后,仅显示 1 个图形。这是“奇怪的行为”,需要像@shadanan 答案中所示的解决方法。 ipython 开发人员可以对此发表评论吗?它是一个错误吗?
【问题讨论】:
-
对于interact,你应该做一个同时接受两个参数的函数,并且只调用一次display。
-
已更正感谢@ThomasK。我还是有抑制第一个数字显示的问题...
标签: python matplotlib ipython ipython-notebook