Matplotlib的“交互模式”(ion(), ioff())的确切语义是什么?

21 投票
2 回答
27131 浏览
提问于 2025-04-16 18:20

Matplotlib的pyplot部分的“交互模式”文档中提到:

pyplot接口的交互属性控制每次pyplot命令是否都绘制图形。如果交互模式为假(False),那么每次绘图命令都会更新图形状态,但只有在明确调用draw()时才会显示图形。当交互模式为真(True)时,每个pyplot命令都会自动绘制图形。

这看起来很清楚:当交互模式开启时,可以直接使用plot()而不需要再调用draw()。不过,在下面的代码中调用draw()却没有任何效果:

from matplotlib import pyplot as pp

# Interactive mode is off by default

pp.plot([10, 20, 50])
pp.draw()

raw_input('Press enter...')  # No graph displayed?!!

(在Windows XP上,使用Matplotlib 1.0.1)。

在开头加上ion()可以让图形显示出来,同时等待用户按下回车键(这时会方便地关闭所有图形):

from matplotlib import pyplot as pp

ion()

pp.plot([10, 20, 50])  # No draw() is necessary

raw_input('Press enter...')  # The graph is interactive *and* the terminal responds to enter

因此,看起来ion()的作用不仅仅是让每次绘图命令后自动更新图形,而我在文档中找不到相关的信息。另一个更重要的问题是,ion()会让所有绘图命令都更新图形,这在需要多次更新同一张图时会很耗时。

所以,有没有办法:

  • 让终端在用户按下回车后自动关闭所有图形,
  • 使用交互式的Matplotlib图形,
  • …而不需要一开始就强制开启交互模式(这样就不会强制自动更新图形,避免耗时)?

2 个回答

4

我建议你参考一下“Thomas K”的最后一个评论。我记得在邮件列表上有类似的问题,但我找了好几分钟也没找到,真抱歉。

我之前也遇到过这个问题,对我来说更简单的方法是使用 ipython --pylab。我安装的 matplotlib 版本比较旧,跟 ion() 有些问题。此外,matplotlib 在 Windows 上使用 draw() 也有一些问题。也许在最新版本中这些问题已经解决了。

附言:很抱歉我没能很好地帮助你。

祝好。

16

这里是关于这个话题在Matplotlib邮件列表中一个有趣讨论的总结。简单来说就是:

  • 交互模式(通过 ion() 激活)能自动处理很多事情。特别是,pyplot.* 的命令会自动在屏幕上更新相关的坐标轴。不过,对于像 ax.plot() 这样的Matplotlib对象方法(这里的 ax 是一个坐标轴对象),通常不会自动更新;在这种情况下,需要用 pyplot.draw() 来手动更新。

  • 非交互模式就没那么方便了。draw() 通常不会在屏幕上更新图形。现在的文档里没有提到 draw() 在非交互模式下有点“无效”,但希望不久后能在文档中加入这部分内容。

同时,关于交互模式和非交互模式的更多信息可以在Matplotlib的一个当前分支中找到。关于 draw()show() 及相关内容的更好文档也可以在同一个分支中找到。

撰写回答