在 Python shell 中使用 Matplotlib
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
警告
該頁(yè)面的內(nèi)容已嚴(yán)重過(guò)時(shí)。
默認(rèn)情況下位仁,matplotlib 將繪圖延遲到腳本結(jié)束,因?yàn)槔L圖可能是開(kāi)銷大的操作管宵,并且你可能不想在每次更改單個(gè)屬性時(shí)更新繪圖,而是只在所有屬性更改后更新一次胁住。
但是在 python shell 中工作時(shí)沦寂,通常需要用每個(gè)命令更新繪圖,例如爽航,在更改xlabel()
或一行的標(biāo)記樣式之后。 雖然這在概念上很簡(jiǎn)單乾忱,但在實(shí)踐中它可能很棘手讥珍,因?yàn)?matplotlib 在底層是一個(gè)圖形用戶界面應(yīng)用程序,并擁有一些技巧窄瘟,使應(yīng)用程序在一個(gè) python shell 正常工作衷佃。
使用 IPython 解決
注意
這里描述的模式出于歷史原因仍然存在,但強(qiáng)烈建議不要使用蹄葱。它污染函數(shù)的命名空間氏义,會(huì)影響 python 內(nèi)建設(shè)施锄列,并可能導(dǎo)致錯(cuò)誤難以跟蹤。 要獲得 IPython 集成而無(wú)需導(dǎo)入惯悠,使用
%matplotlib
魔術(shù)命令是首個(gè)選擇邻邮。 參見(jiàn) ipython 文檔。
幸運(yùn)的是克婶,一個(gè)增強(qiáng)的交互式 python shell筒严,ipython 已經(jīng)找出了所有這些技巧,并且可被 matplotlib 感知情萤,所以當(dāng)你在 pylab 模式下啟動(dòng) ipython萝风。
johnh@flag:~> ipython
Python 2.4.5 (#4, Apr 12 2008, 09:09:16)
IPython 0.9.0 -- An enhanced Interactive Python.
In [1]: %pylab
Welcome to pylab, a matplotlib-based Python environment.
For more information, type 'help(pylab)'.
In [2]: x = randn(10000)
In [3]: hist(x, 100)
它為你設(shè)置一切使交互式繪圖工作,就像你期望的那樣紫岩。 調(diào)用figure()
并彈出圖形窗口,調(diào)用plot()
使你的數(shù)據(jù)出現(xiàn)在圖形窗口中睬塌。
注意在上面的例子中泉蝌,我們沒(méi)有導(dǎo)入任何 matplotlib 名稱,因?yàn)樵?pylab 模式下揩晴,ipython 將自動(dòng)導(dǎo)入它們勋陪。 ipython 還為你啟用交互模式,這會(huì)導(dǎo)致每個(gè) pyplot 命令觸發(fā)圖形更新硫兰,并且還提供了一個(gè) matplotlib 感知的運(yùn)行命令诅愚,來(lái)高效運(yùn)行 matplotlib 腳本。 ipython 在運(yùn)行命令期間關(guān)閉交互模式劫映,然后在運(yùn)行結(jié)束時(shí)恢復(fù)交互狀態(tài)违孝,以便你可以手動(dòng)繼續(xù)調(diào)整圖形。
ipython 已經(jīng)嵌入了很多最近的作品泳赋,從 pylab 支持雌桑,到各種 GUI 應(yīng)用程序,所以請(qǐng)檢查 ipython 郵件列表的最新?tīng)顟B(tài)祖今。
其它 Python 解釋器
如果你不能使用 ipython校坑,并且仍然想在交互式 python shell 使用 matplotlib/pylab,例如千诬,plain-ole 標(biāo)準(zhǔn)的 python 交互式解釋器耍目,你將需要了解什么是 matplotlib 后端 。
有了 TkAgg 后端徐绑,它使用 Tkinter 用戶界面工具包邪驮,你可以從任意的非 gui python shell 使用 matplotlib。 只需在你的matplotlibrc
文件中設(shè)置backend : TkAgg
和interactive : True
(請(qǐng)參閱自定義 matplotlib)并啟動(dòng) python傲茄。 然后:
>>> from pylab import *
>>> plot([1,2,3])
>>> xlabel('hi mom')
應(yīng)該能夠開(kāi)箱即用耕捞。 這也可能適用于最新版本的 qt4agg 和 gtkagg 后端衔掸,以及 Macintosh 上的 macosx 后端。 注意俺抽,在批處理模式下敞映,即從腳本制作圖形時(shí),交互模式可能很慢磷斧,因?yàn)樗妹總€(gè)命令重繪圖形振愿。 因此,你可能需要仔細(xì)考慮弛饭,然后通過(guò)matplotlibrc
文件而不是使用下一節(jié)中列出的函數(shù)冕末,使其作為默認(rèn)行為。
Gui shell 問(wèn)題最多侣颂,因?yàn)樗鼈儽仨氝\(yùn)行主循環(huán)档桃,但是交互式繪圖也涉及主循環(huán)。 Ipython 已經(jīng)為 matplotlib 主后端解決了這一切問(wèn)題憔晒。 可能有其他 shell 和 IDE 也可以在交互模式下使用 matplotlib藻肄,但一個(gè)明顯的候選項(xiàng)不會(huì):python IDLE IDE 是一個(gè)不支持 pylab 交互模式的 Tkinter gui 應(yīng)用程序,無(wú)論后端是什么拒担。
控制交互式更新
pyplot
接口的interactive
屬性控制是否在每個(gè)pyplot
命令上繪制圖畫(huà)布嘹屯。 如果interactive
是False
,那么每個(gè)plot
命令都會(huì)更新圖形狀態(tài)从撼,但只會(huì)在顯式調(diào)用draw()
時(shí)繪制州弟。 當(dāng)interactive
為True
時(shí),每個(gè)pyplot
命令都會(huì)觸發(fā)繪制低零。
pyplot
接口提供了 4 個(gè)有助于交互式控制的命令婆翔。
isinteractive()
返回交互式設(shè)置。True|False
掏婶。
ion()
將交互式模式打開(kāi)浙滤。
ioff()
將交互式模式關(guān)閉。
draw()
強(qiáng)制圖形重新繪制气堕。
當(dāng)處理繪圖開(kāi)銷很大的大型圖形時(shí)纺腊,你可能希望臨時(shí)關(guān)閉 matplotlib 的交互式設(shè)置來(lái)避免性能損失:
>>> #create big-expensive-figure
>>> ioff() # turn updates off
>>> title('now how much would you pay?')
>>> xticklabels(fontsize=20, color='green')
>>> draw() # force a draw
>>> savefig('alldone', dpi=300)
>>> close()
>>> ion() # turn updating back on
>>> plot(rand(20), mfc='g', mec='r', ms=40, mew=4, ls='--', lw=3)