Matplotlib的“交互模式”(ion(), ioff())的确切语义是什么?
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 个回答
我建议你参考一下“Thomas K”的最后一个评论。我记得在邮件列表上有类似的问题,但我找了好几分钟也没找到,真抱歉。
我之前也遇到过这个问题,对我来说更简单的方法是使用 ipython --pylab
。我安装的 matplotlib 版本比较旧,跟 ion()
有些问题。此外,matplotlib 在 Windows 上使用 draw()
也有一些问题。也许在最新版本中这些问题已经解决了。
附言:很抱歉我没能很好地帮助你。
祝好。
这里是关于这个话题在Matplotlib邮件列表中一个有趣讨论的总结。简单来说就是:
交互模式(通过
ion()
激活)能自动处理很多事情。特别是,pyplot.*
的命令会自动在屏幕上更新相关的坐标轴。不过,对于像ax.plot()
这样的Matplotlib对象方法(这里的ax
是一个坐标轴对象),通常不会自动更新;在这种情况下,需要用pyplot.draw()
来手动更新。非交互模式就没那么方便了。
draw()
通常不会在屏幕上更新图形。现在的文档里没有提到draw()
在非交互模式下有点“无效”,但希望不久后能在文档中加入这部分内容。
同时,关于交互模式和非交互模式的更多信息可以在Matplotlib的一个当前分支中找到。关于 draw()
、show()
及相关内容的更好文档也可以在同一个分支中找到。