Python Shell 下使用 matplotlib
创建时间:2012年12月10日
matplotlib默认是延迟绘图直到脚本结束,因为绘图是一个高代价的操作。所以可能不想每次每个属性的改变就更新绘图,只有所有的属性都改变了才更新。
但是,当在 Python Shell 上工作时,你通常希望图形能够根据每个命令如改变xlabel()或线条标识类型时都更新。这种概念上非常简单,但在实际中确实很复杂,因为 matplotlib 本质上是一个图形用户界面应用程序,所以有很多技巧来使 matplotlib 在 Python Shell 上工作得很好。
6.1 使用 ipython
幸运的是,ipython 是一个增强的交互式 Python Shell,具有许多技巧和 matplotlib 提示,所以你可以使用 pylab 模式启动 ipython。
johnh@flag:~> ipython -pylab Python 2.4.5 (#4, Apr 12 2008, 09:09:16) IPython 0.9.0 -- An enhanced Interactive Python. Welcome to pylab, a matplotlib-based Python environment. For more information, type 'help(pylab)'.
它会如你所期待的那样做很多交互式绘图工作。调用 figure() 会弹出视图窗口;调用 plot(),你的数据就会显示在视图窗口上。
注意上面的示例中,我们并没有导入任何 matplotlib 包,因为这是在 pylab 模式下,ipython 会自动把它们导入进来。ipython 会为你打开交互式模式,这会导致 pylab 命令触发视图窗口更新,同时提供了 matplotlib 提示 run 命令来有效运行脚本。ipython 会在运行 run 命令时关闭交互式模式,然后在运行完毕后恢复到交互式模式的状态,你又可以继续手动操作视图窗口。
6.2 其他 Python 解释器
如果你没有使用 ipython,但仍想使用 matplotlib/pylab 模式在交互式 Python Shell 上工作。你应该了解什么是 matplotlib 的后端(什么是后端?)。
设置为 TkAgg 后端就可以使用 Tkinter 的用户接口工具箱,你也可以在任意的 Python Shell 中使用 matplotlib,只需要设置你的后端为 backend : TkAgg,interactive : True 在你的 matplotlibrc 文件中(查看定制 matplotlib),然后启动 Python。
>>> from pylab import * >>> plot([1, 2, 3]) >>> xlabel('hi mom') 这样就可以即开即用。注意在批处理模式下,如从脚本中创建视图窗口,交互模式可能会很慢,因为它会为每个命令重绘。所以在设置这个为默认行为前,请考虑清楚。
对于其他的用户接口工具箱和对应的 matplotlib 后端,这种情形很复杂,因为 GUI 的 mainloop 会占用整个处理过程。解决方案就是使用单独的线程运行图形界面,这就是 ipython 很聪明的解决 matplotlib 支持大多数包的方式。据报道,pygtk 的后续版本可以很好地支持标准 Python Shell,这是太好了!
6.3 控制交互式更新
pyplot 接口的交互式属性控制着是否视图窗口绘图面板在每个 pyplot 命令都绘制。如果 interactive 设置为 False,视图窗口会在每个绘图命令后调用 draw() 命令才会绘制。如果 interactive 设置为 True,每个 pyplot 命令都会重新绘制。
pyplot 接口提供了4个有用命令来控制交互式模式:
当处理大数据时,绘图的代价很高时,你可能想关闭 matplotlib 的交互式设置以提供性能:
>>> ioff() >>> title("now how much would you pay") >>> xticklabel(fontsize=20, color='green') >>> draw() >>> savefig('alldone', dpi=300) >>> close() >>> ion() >>> plot(rand(20), mfc='g', mec='r', ms=40, mew=4, ls='--', lw=3)