目錄:
Python Shell下使用matplotlib
1 救星Ipython
2 其它pyton解釋器
3 控制交互式更新
matplotlib默認是延遲繪圖直到腳本結束,因為繪圖是一個高代價的操作。所以可能不想每次每個屬性的改變就更新繪圖,只有所有的屬性都改變了才更新。
但是,當在python shell上工作時,你通常想圖形根據每個命令如改變xlabel()或者線條標識類型時都更新。概念上這是很簡單的,但是在實際中確實很復雜,因為matplotlib本質上是圖形用戶接口應用程序,所以有很多技巧來使matplotlib在python shell上工作的很好。
1 救星Ipython
幸運的是,ipython,增強的交互式python shell.有很多技巧和matplotlib提醒,所以你可以用pylab模式啟動ipython。
www.linuxidc.com @linux:~> 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郵件列表裡查看最新狀態。
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,這是太好了!
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)