Python Shell下使用matplotlib

Python Shell下使用matplotlib

Created Monday 10 December 2012

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)'.

In [1]: x = randn(10000)

In [2]: hist(x, 100)

它会如你所期待的那样做了很多交互式绘图工作。调用figure(),就会弹出视图窗口;调用plot(),你的数据就会显示在视图窗口上。

注意在上面的示例中,我们并没有导入任何matplotlib包,因为这是在pylab模式下,ipython会自动把它们导入进来。ipython会为你打开交互式模式,这会导致pyplot命令触发视图窗口更新,同时提供了matplotlib提醒run命令来有效运行脚本。ipython会关闭交互式模式当运行run命令时,然后在运行完毕使恢复到交互式模式的状态,你又可以继续手动操作视图窗口。

在pylab模式的支持下,ipython己经为嵌入到图形用户接口应用程序做了很多工作,可以在Ipython邮件列表里查看最新状态。

6.2 其它pyton解释器

如果你没有使用ipython,但是还想使用matplotlib/pylab模式在交互式python shell上。如标准python交互式解释器,或者你喜欢的IDE下的解释器,你应该了解什么是matplotlib的后端(什么是后端?)

设置为TkAgg后端就可以使用Tkinter的用户接口工具箱,你也使用matplotlib在任意的python shell,仅仅需要设置你的后端和交互式模式 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个有用命令来控制交互式
isinteractive()返回interactive的设置True| False
ion() 打开交互式模式
ioff() 关闭交互式模式
draw() 强制视图窗口重绘

当处理大数据,要绘图的代价很大时,你可能想关闭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)

你可能感兴趣的:(python,matplotlib)