約定我們導(dǎo)入matplotlib時(shí),推薦使用: import matplotlib as mpl 因此,簡潔起見,在后面我們將經(jīng)常使用 mpl代表matplotlib。 還將用:
有一部分初學(xué)者,因?yàn)閷?duì)位圖、矢量圖、分辨率、DPI、PPI、圖像尺寸、坐標(biāo)等概念的不清晰,也造成了學(xué)習(xí)、使用mpl的一些困擾。 將會(huì)專門以一篇文章,用草根的語言討論一下這些基本概念,理清這些概念對(duì)理解matplotlib框架非常有好處。 Matplotlib基礎(chǔ)架構(gòu)Matplotlib是基于Pythony語言,旨在為Python提供一個(gè)數(shù)據(jù)繪圖包的開源項(xiàng)目,它以Python的一個(gè)庫包的形式分發(fā)、安裝、調(diào)用。 mpl是Python的一個(gè)包,記?。篜ython包就是一個(gè)定義了__init__.py文件的文件夾而已,包中的各個(gè)模塊都會(huì)保存在這個(gè)文件夾中。 matplotlib 實(shí)際上就是提供了 3 種API,用于不同的繪圖場景。
mpl需要其它包的支持,主要有:
函數(shù)式繪圖 pyplot APImatplotlib是受MATLAB的啟發(fā)構(gòu)建的,MATLAB語言是面向過程的,利用函數(shù)的調(diào)用,MATLAB中可以輕松的利用一行命令來繪制直線,然后再用一系列的函數(shù)調(diào)整結(jié)果。 matplotlib通過matplotlib.pyplot模塊,完全仿照MATLAB的函數(shù)形式,提供了一套繪圖接口。這套函數(shù)接口方便MATLAB用戶過度到matplotlib包。 Python中的函數(shù)式編程是通過封裝對(duì)象實(shí)現(xiàn)的。matplotlib中的函數(shù)式調(diào)用其實(shí)也是如此。matplotlib本質(zhì)上還是構(gòu)建對(duì)象來構(gòu)建圖像。只不過pyplot函數(shù)將構(gòu)建對(duì)象的過程封裝在函數(shù)中,從而讓我們覺得很方便。 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é)者來說,它很簡單,也很容易模仿,但很多人不知道,函數(shù)封裝的一些東西在后臺(tái)做了些什么,因此長時(shí)間只能照貓畫虎。 面向?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(畫布),所以需要引入兩個(gè)類: Figure和mpl.backends.backend_agg.FigureCanvasAgg。所以代碼看其來要長得多、復(fù)雜得多。 但這時(shí),我們反而非常清楚我們創(chuàng)建的每個(gè)對(duì)象,對(duì)象之間的關(guān)系,以及我們正在做什么。 函數(shù)式編程也調(diào)用了這些類,只是調(diào)用的過程被函數(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圖開始才是學(xué)習(xí)matplotlib的正確姿勢! 跟著我前進(jìn),等你學(xué)習(xí)一段時(shí)間后,你就會(huì)有打通matplotlib修煉任督二脈的感覺。 pylab,仿matlab模式matplotlib.pylab是一個(gè)模塊,它在單個(gè)名稱空間中批量導(dǎo)入matplotlib.pyplot、numpy以及一些附加函數(shù)用于繪圖。 最初的目的是通過將所有函數(shù)導(dǎo)入全局命名空間來模仿類似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)見后續(xù)更新。 下一篇:PPI,DPI,inches,Axes, Axis......不再擰不清 本系列文章系本人學(xué)習(xí)筆記的整理和經(jīng)驗(yàn)教訓(xùn)的總結(jié),難免有偏、錯(cuò)之處,歡迎大家在討論區(qū)交流。也歡迎對(duì)后續(xù)寫作提出寶貴建議! 關(guān)注”Python草堂“頭條號(hào),和我一起通向mpl的自由殿堂! |
|