Matplotlib的“交互模式”(ion(),ioff())的精确语义?

时间:2011-05-25 20:15:39

标签: python matplotlib ion interactive-mode

Matplotlib的pyplot中“交互模式”的文档为:

  

pyplot界面的交互属性控制是否在每个pyplot命令上绘制图形画布。如果interactive为False,则每个绘图命令都会更新图形状态,但只会在显式调用draw()时绘制。当interactive为True时,则每个pyplot命令都会触发绘制。

这似乎很清楚:当交互模式启用时,可以plot()进行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?!! 。但是,在以下代码中执行draw()不会执行任何操作:

ion()

(在Windows XP上,Matplotlib 1.0.1)。

在开头添加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 会显示图形,同时等待用户输入enter(方便地关闭所有数字):

ion()

因此,看起来ion()更多而不仅仅是在每个绘图命令之后添加自动图形更新,遗憾的是我在文档中找不到任何内容。后一个程序的另一个更重要的问题是{{1}}使所有绘图命令更新图形,这在单个图形被多次更新时非常耗时。

那么,有没有办法:

  • 终端等待进入,之后所有数字都自动关闭,
  • 有交互式Matplotlib图表,
  • ...没有强制交互模式在开始时打开(以便不强制自动更新图形,这可能很耗时)?

2 个答案:

答案 0 :(得分:15)

以下是Matplotlib邮件列表中有关此主题的interesting discussion摘要。执行摘要是:

  • 交互模式(使用ion()激活)可以自动执行许多操作。特别是,pyplot.*命令会在屏幕上自动更新相关轴。但是,对像ax.plot()ax是Axes对象)这样的Matplotlib对象的方法调用通常不会执行自动更新;在这种情况下,pyplot.draw()会执行必要的更新。)

  • 非交互模式不太方便。 draw() 通常会更新屏幕上的数字。在当前文档中没有提到draw()在非交互模式下有些“不活跃”的事实,但希望很快就会包含在那里。

同时,有关交互式和非交互式模式的更多信息可以在Matplotlib的a current branch中找到。 draw()show()和朋友的更好documentation也可以在同一分支中找到。

答案 1 :(得分:4)

我建议您按照'Thomas K'的最后评论。我记得邮件列表上有一个类似的问题,但经过几分钟的搜索后我找不到它。遗憾。

我也有这个问题,对我来说更简单的方法是使用ipython --pylab。我安装了更旧版本的matplotlib,但ion()存在一些问题。除此之外,matplotlib在Windows上也存在draw()的一些问题。也许它已在最新版本中修复。

p.s。:很抱歉我帮不了你。

最好的问候。