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

21

Matplotlib Pyplot的“交互模式”文档如下:

Pyplot接口的interactive属性控制是否在每个pyplot命令上绘制一个图形画布。 如果interactive为False,则图形状态将在每个plot命令上更新,但只会在draw()显式调用时绘制。 当interactive为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 图形,
  • ... 而不强制开始时就开启交互模式(以避免强制自动更新图形,这可能需要很长时间)?

我认为你需要调用 pp.show() 而不是 pp.draw() - Thomas K
@Thomas K:目标是让程序等待用户输入回车键,因此show()被排除在外。 - Eric O. Lebigot
据我所知,交互模式是实现这一目标的唯一方式。但是我并不是专家——您可能需要在matplotlib用户邮件列表上询问。 - Thomas K
2个回答

16

以下是Matplotlib邮件列表中关于此主题的有趣讨论摘要:

  • 交互模式(使用ion()激活)自动化了许多事情。特别地,pyplot.*命令会自动更新相关轴线的屏幕显示。但是,对于Matplotlib对象的方法调用(例如ax.plot(),其中ax是Axes对象),通常不会执行自动更新;在这种情况下,pyplot.draw()执行必要的更新。

  • 非交互模式不太方便。 draw()通常不会在屏幕上更新图形。目前的文档没有提到draw()在非交互模式下有些"不活跃",但希望很快能在文档中加入相关说明。

同时,在Matplotlib的当前分支中可以找到更多关于交互和非交互模式的信息。同一分支还提供了更好的draw()show()等函数文档


你能否解释一下如何使用ax,以便于新手Matplotlib用户理解? - AturSams
ax 在一个 Axes 对象中:它本质上是一个带有坐标的盒子(或圆形),因此一个图形可以包含多个轴。在实践中,当您在一个图形中创建轴时,会返回 Axes 对象。因此,通常使用类似以下命令获取 Axes:fig = pyplot.figure(); ax = fig.add_subplot(111)fig, (ax_scatter, ax_log_hist) = pyplot.subplots(1, 2) - Eric O. Lebigot
@EricOLebigot 这个分支的链接已经失效了。 - ComputerScientist

4
我建议您遵循'Thomas K'的最后一条评论。我记得在邮件列表上有一个类似的问题,但我搜索了几分钟后找不到它。对不起。
我也遇到过这个问题,对我来说更好更容易的方法是使用ipython --pylab。我安装了一个更旧的版本的matplotlib,它与ion()有些问题。此外,matplotlib在Windows上也存在一些draw()问题。也许在最新版本中已经解决了。
附言:抱歉我没能帮助你真正地解决问题。
最好的问候。

我在matplotlib-user邮件列表中也没有找到任何相关答案。我刚刚在那里发布了一条新消息。谢谢你的建议。 - Eric O. Lebigot
PS:这是线程链接:http://old.nabble.com/Exact-semantics-of-ion%28%29---tt31728909.html#a31743029。我会在确认一些要点后尽快总结我们在那里进行的有趣讨论的结果。 - Eric O. Lebigot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接