日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

03-Matplotlib繪圖邏輯框架之基礎(chǔ)架構(gòu)

 星光閃亮圖書館 2019-08-30

約定

我們導(dǎo)入matplotlib時(shí),推薦使用:

import matplotlib as mpl

因此,簡潔起見,在后面我們將經(jīng)常使用 mpl代表matplotlib。

還將用:

  • figure ,表示matplotlib繪制的圖形;
  • Image,表示位圖圖像,或柵格圖像,保存方式為點(diǎn)陣存儲(chǔ),也稱為點(diǎn)陣圖像;
  • Graphic,表示矢量圖形,用數(shù)學(xué)方法描述的圖形。

有一部分初學(xué)者,因?yàn)閷?duì)位圖、矢量圖、分辨率、DPI、PPI、圖像尺寸、坐標(biāo)等概念的不清晰,也造成了學(xué)習(xí)、使用mpl的一些困擾。

將會(huì)專門以一篇文章,用草根的語言討論一下這些基本概念,理清這些概念對(duì)理解matplotlib框架非常有好處。

Matplotlib基礎(chǔ)架構(gòu)

03-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,用于不同的繪圖場景。

  • The pyplot API
  • The object-oriented API
  • The pylab API (已棄用)

mpl需要其它包的支持,主要有:

  • numpy,用于提供繪圖數(shù)據(jù),你要用于繪圖的數(shù)據(jù)都應(yīng)轉(zhuǎn)換化numpy 的 ndarray,才傳遞給mpl;。事實(shí)上,一幅圖像也可以保存為一個(gè)ndarray(將專門介紹)。
  • backend,后端,簡單地說就是將mpl代碼轉(zhuǎn)換為圖形的后臺(tái)算法,如mpl中最常用的FigureCanvasAgg,將專文討論backend。

函數(shù)式繪圖 pyplot API

matplotlib是受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):

  1. 增加了一層“函數(shù)”調(diào)用,降低了效率。
  2. 隸屬關(guān)系被函數(shù)掩蓋。整個(gè)matplotlib包是由一系列有組織有隸屬關(guān)系的對(duì)象構(gòu)成的。函數(shù)掩蓋了原有的隸屬關(guān)系,將事情變得復(fù)雜、模糊。
  3. 細(xì)節(jié)被函數(shù)掩蓋。pyplot并不能完全復(fù)制對(duì)象體系的所有功能,圖像的許多細(xì)節(jié)調(diào)整最終還要回到對(duì)象。
  4. 每件事情都可以有至少兩種方式完成,用戶很容易混淆。
  5. 封裝,掩蓋了真相,蒙蔽了很多初學(xué)者的雙眼,讓他們迷失在mpl世界的邊緣,始終不能達(dá)到自由操控mpl的境界。

第4、5組成了一個(gè)陷阱,它就是困住很多初學(xué)者的那個(gè)最大的坑。

再看下面的函數(shù)繪圖的示例:

import matplotlib.pyplot as pltplt.plot([1, 2, 3, 4])plt.show()

03-Matplotlib繪圖邏輯框架之基礎(chǔ)架構(gòu)

對(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é)

  • mpl以numpy, backend為支撐,提供了函數(shù)式繪圖、面向?qū)ο罄L圖兩種繪圖模式(API);
  • 面向?qū)ο罄L圖是mpl的核心、精髓,請(qǐng)從這里開始;
  • pyplot僅是對(duì)對(duì)象的封裝而已,會(huì)自然習(xí)得。

關(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的自由殿堂!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多