約定我們導(dǎo)入matplotlib時(shí),推薦使用: import matplotlib as mpl 因此,簡(jiǎn)潔起見(jiàn),在后面我們將經(jīng)常使用 mpl代表matplotlib。 還將用:
有一部分初學(xué)者,因?yàn)閷?duì)位圖、矢量圖、分辨率、DPI、PPI、圖像尺寸、坐標(biāo)等概念的不清晰,也造成了學(xué)習(xí)、使用mpl的一些困擾。 將會(huì)專(zhuān)門(mén)以一篇文章,用草根的語(yǔ)言討論一下這些基本概念,理清這些概念對(duì)理解matplotlib框架非常有好處。 Matplotlib基礎(chǔ)架構(gòu)Matplotlib是基于Pythony語(yǔ)言,旨在為Python提供一個(gè)數(shù)據(jù)繪圖包的開(kāi)源項(xiàng)目,它以Python的一個(gè)庫(kù)包的形式分發(fā)、安裝、調(diào)用。 mpl是Python的一個(gè)包,記?。篜ython包就是一個(gè)定義了__init__.py文件的文件夾而已,包中的各個(gè)模塊都會(huì)保存在這個(gè)文件夾中。 matplotlib 實(shí)際上就是提供了 3 種API,用于不同的繪圖場(chǎng)景。
mpl需要其它包的支持,主要有:
函數(shù)式繪圖 pyplot APImatplotlib是受MATLAB的啟發(fā)構(gòu)建的,MATLAB語(yǔ)言是面向過(guò)程的,利用函數(shù)的調(diào)用,MATLAB中可以輕松的利用一行命令來(lái)繪制直線,然后再用一系列的函數(shù)調(diào)整結(jié)果。 matplotlib通過(guò)matplotlib.pyplot模塊,完全仿照MATLAB的函數(shù)形式,提供了一套繪圖接口。這套函數(shù)接口方便MATLAB用戶過(guò)度到matplotlib包。 Python中的函數(shù)式編程是通過(guò)封裝對(duì)象實(shí)現(xiàn)的。matplotlib中的函數(shù)式調(diào)用其實(shí)也是如此。matplotlib本質(zhì)上還是構(gòu)建對(duì)象來(lái)構(gòu)建圖像。只不過(guò)pyplot函數(shù)將構(gòu)建對(duì)象的過(guò)程封裝在函數(shù)中,從而讓我們覺(jué)得很方便。 pyplot函數(shù)式繪圖創(chuàng)造了一個(gè)仿真MATLAB的工作環(huán)境,并有許多成形的繪圖函數(shù),如果只是作為Matplotlib的一般用戶,pyplot可以滿足大部分的需求。 但利用函數(shù)式繪圖會(huì)有以下缺點(diǎn):
第4、5組成了一個(gè)陷阱,它就是困住很多初學(xué)者的那個(gè)最大的坑。 再看下面的函數(shù)繪圖的示例: import matplotlib.pyplot as pltplt.plot([1, 2, 3, 4])plt.show() 對(duì)于初學(xué)者來(lái)說(shuō),它很簡(jiǎn)單,也很容易模仿,但很多人不知道,函數(shù)封裝的一些東西在后臺(tái)做了些什么,因此長(zhǎng)時(shí)間只能照貓畫(huà)虎。 面向?qū)ο?strong>(OO, object-oriented)繪圖我們改用面向?qū)ο?OO, object-oriented)繪圖方式繪制上面的直線圖。 from matplotlib.figure import Figurefrom matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvasfig = Figure()canvas = FigureCanvas(fig)ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])line, = ax.plot([1, 2, 3, 4])s, (width, height) = canvas.print_to_buffer() from PIL import Image im = Image.frombytes('RGBA', (width, height), s)im.show() 大家先復(fù)制這些代碼,運(yùn)行看看就可以了,后面會(huì)詳細(xì)解釋它們。 因?yàn)?,面向?qū)ο罄L圖需要我們一步一步地創(chuàng)建需要的對(duì)象,包括基礎(chǔ)的Figure,F(xiàn)igureCanvasAgg(畫(huà)布),所以需要引入兩個(gè)類(lèi): Figure和mpl.backends.backend_agg.FigureCanvasAgg。所以代碼看其來(lái)要長(zhǎng)得多、復(fù)雜得多。 但這時(shí),我們反而非常清楚我們創(chuàng)建的每個(gè)對(duì)象,對(duì)象之間的關(guān)系,以及我們正在做什么。 函數(shù)式編程也調(diào)用了這些類(lèi),只是調(diào)用的過(guò)程被函數(shù)調(diào)用所遮掩,所以初學(xué)者對(duì)函數(shù)創(chuàng)建的對(duì)象常是模糊的,似懂非懂的。函數(shù)式繪圖提供了狀態(tài)機(jī)接口,會(huì)自動(dòng)對(duì)當(dāng)前對(duì)象進(jìn)行繪圖操作,所以對(duì)象的調(diào)用思路也是不清晰的。 而面向?qū)ο罄L圖不同,每個(gè)對(duì)象都是你明確創(chuàng)建的,要對(duì)哪個(gè)對(duì)象進(jìn)行操作也是顯式調(diào)用的,所以你就知其然且知其所以然。 以我個(gè)人的經(jīng)驗(yàn),認(rèn)為:從面向?qū)ο罄L圖開(kāi)始才是學(xué)習(xí)matplotlib的正確姿勢(shì)! 跟著我前進(jìn),等你學(xué)習(xí)一段時(shí)間后,你就會(huì)有打通matplotlib修煉任督二脈的感覺(jué)。 pylab,仿matlab模式matplotlib.pylab是一個(gè)模塊,它在單個(gè)名稱(chēng)空間中批量導(dǎo)入matplotlib.pyplot、numpy以及一些附加函數(shù)用于繪圖。 最初的目的是通過(guò)將所有函數(shù)導(dǎo)入全局命名空間來(lái)模仿類(lèi)似MATLAB的工作方式。由于大量導(dǎo)入全局命名空間可能會(huì)導(dǎo)致意外行為,現(xiàn)在這被認(rèn)為是糟糕的風(fēng)格。因此強(qiáng)烈建議不要使用pylab。 事實(shí)上在matplotlib的最新版中已棄用它。 因此,后面,我們將認(rèn)為mpl只有pyplot函數(shù)式繪圖和面向?qū)ο罄L圖兩套API。 總結(jié)
關(guān)于mpl框架的更詳細(xì)介紹請(qǐng)見(jiàn)后續(xù)更新。 下一篇:PPI,DPI,inches,Axes, Axis......不再擰不清 本系列文章系本人學(xué)習(xí)筆記的整理和經(jīng)驗(yàn)教訓(xùn)的總結(jié),難免有偏、錯(cuò)之處,歡迎大家在討論區(qū)交流。也歡迎對(duì)后續(xù)寫(xiě)作提出寶貴建議! 關(guān)注”P(pán)ython草堂“頭條號(hào),和我一起通向mpl的自由殿堂! |
|
|
來(lái)自: 星光閃亮圖書(shū)館 > 《Python學(xué)習(xí)》