Matplotlib做圖工具核心框架邏輯梳理
本文簡要介紹Matplotlib做圖工具的系統(tǒng)架構(gòu),文章使用類圖簡要梳理Matplotlib的核心架構(gòu)思路,立足于洞察工具的核心架構(gòu)邏輯,支撐工具的日常使用。并對畫布的四層級(jí)容器的作用和使用做演示說明。
一、概要架構(gòu)圖
用計(jì)算機(jī)工具做圖,是現(xiàn)實(shí)世界中畫畫,本質(zhì)需要準(zhǔn)備的東西是一致的,主要包括畫圖工具和畫布兩大模塊。
二、畫圖工具
1. 畫圖工具說明
畫圖工具就是各種筆,鉛筆、水彩筆、刷子、顏料等,每種工具發(fā)揮的作用各有不同。
matplotlib采用面向?qū)ο笤O(shè)計(jì)架構(gòu),設(shè)計(jì)中肯定借鑒了該思路。區(qū)別是計(jì)算機(jī)程序不能完全對照現(xiàn)實(shí)的對象構(gòu)建程序。
現(xiàn)實(shí)中,畫家雖然需要準(zhǔn)備各種畫筆,但是最終有價(jià)值的是畫家涂鴉的各種形狀、色彩、布局等,畫筆、顏料等只是實(shí)現(xiàn)涂鴉的手段。
計(jì)算機(jī)畫圖,本質(zhì)是操作各種數(shù)字的變化涂鴉,所以畫圖工具,只需要構(gòu)建各種可以用來組裝的基本圖形、顏色的積木和拼裝平臺(tái)即可。
下圖中的rectangel、circle、line2d、axesimage等就是可供拼接的積木。window、figure、axes、axis就是積木拼接的平臺(tái)。
2. 畫圖工具類圖
按照面向?qū)ο蟮乃枷耄蟛糠值募軜?gòu)都會(huì)劃分為工具區(qū)和應(yīng)用區(qū)。此處工具區(qū)的包括各種形狀的定義、顏色、線條等。
三、 圖像載體
畫布屬于圖像載體,圖像載體還包括其他間接載體,硬盤也是圖像載體。
1. 圖像載體說明
有了畫圖工具,接下來就需要畫布?,F(xiàn)實(shí)生活中可以在墻上、紙上、沙地上,各種載體都可以作為畫布。顯然,畫在墻上,別人想?yún)⒂^,只能到現(xiàn)場,畫到紙上,可以把紙帶給別人,畫在沙地上,風(fēng)吹就會(huì)消失。
只有所承載的容器能被更大的容器容納,能實(shí)現(xiàn)儲(chǔ)存、運(yùn)輸、交換,這個(gè)載體才是好載體。
為了使圖畫能支撐更多的移動(dòng)、組合,matplotlib使用了四層容器。
2. 圖像載體類圖
3. 載體承載關(guān)系圖
容器承載的邏輯生活中到處都是:餅干密封到包裝袋、然后一起包裝到盒子、箱子里,裝到運(yùn)載車輛里,車輛在地球上,地球在宇宙中…
使用容器承載,就需要以對容器指定坐標(biāo)系,用以確定承載物的位置關(guān)系。比如袋子裝餅干、杯子接水,只是這種承載非常直觀,我們并未顯式的聲明容器的位置關(guān)系。只有特別大的東西才會(huì)聲明坐標(biāo)系,比如地球的經(jīng)緯度坐標(biāo)系。
在計(jì)算機(jī)世界里,所有的東西都需要人工構(gòu)建出來,所以所有的容器都需要聲明坐標(biāo)系。小到數(shù)值,大到對象、模塊、應(yīng)用程序,只是隨著軟件的發(fā)展,直接面向內(nèi)存編碼的任務(wù)更多的交給計(jì)算機(jī)軟件自動(dòng)執(zhí)行了。
四、 單坐標(biāo)系構(gòu)圖
雖然,容器層層包裝的情況是普遍的,但是各個(gè)容器之間的關(guān)系并不是均等的,比如雖然餅干經(jīng)過若干層的包裝,但是只有餅干本身才是營養(yǎng)的最終承載者,其余的塑料包裝、盒包裝、箱包裝、到汽車車廂等,其他所有的容器的意義都是為了方便餅干的保存、交易、運(yùn)輸?shù)裙δ堋?/p>
Axes在這四個(gè)包裝容器的地位如同餅干相對于盒、箱、車廂包裝的意義。
Axes是容器的核心,所有的畫圖工具都可以通過該對象直接訪問,雖然axis是最小的容器,但是脫離Axes對象,Axis對象無法單獨(dú)發(fā)揮作用。
1. 單坐標(biāo)圖的默認(rèn)效果
如下圖,坐標(biāo)系的橫坐標(biāo)為:(-10,10)與函數(shù)x的區(qū)間完全一致。
該圖使用x的數(shù)值邊界作為坐標(biāo)系x軸邊界,此處(-10,10)被用作axis的默認(rèn)值。
此種訪問邏輯,沒有顯式的聲明window、figure、axes、axis并不表示他們不存在,pyplot是用裝飾器模式,將這四個(gè)對象的細(xì)節(jié)隱藏起來了,可以極大減少參數(shù)的輸入,降低使用的復(fù)雜度。
2. 單坐標(biāo)圖調(diào)增坐標(biāo)系范圍
axis是坐標(biāo)軸有兩個(gè)軸,x軸和y軸的大小是分別調(diào)節(jié)實(shí)現(xiàn)的。
調(diào)整后的坐標(biāo)軸和x,y的范圍不一致了。該方式可以用于調(diào)整查看圖形的視角。
對比可知,兩條曲線從數(shù)值上看是完全相同的,但是坐標(biāo)系的大小不同,可觀察的視覺就不同。
3. 單坐標(biāo)系疊加多圖
如代碼所示,如果仍然僅適用默認(rèn)的axes,多個(gè)疊加的圖,只能共享同一個(gè)坐標(biāo)系。
五、多坐標(biāo)系疊加多圖
疊加多坐標(biāo)軸圖片時(shí),必須顯式的聲明figure、axes,否則無法實(shí)現(xiàn)。
window不需要顯式聲明是因?yàn)?,代碼執(zhí)行時(shí)系統(tǒng)會(huì)自動(dòng)聲明,每次執(zhí)行就是一個(gè)window。
axis不需要顯式聲明是因?yàn)?,axis與axes是一對一對應(yīng)的并且是聚合關(guān)系,聲明axes時(shí),系統(tǒng)會(huì)自動(dòng)聲明axis。
figure、axes必須手動(dòng)聲明是因?yàn)?,他們與父類都是組合關(guān)系,他們與父類組合時(shí),需要每個(gè)子類以對象的維度單獨(dú)聲明。
由于figure、axes需要單獨(dú)聲明,所以需要輸入的參數(shù)較多,非必要不要使用該方式。
此處要使用多個(gè)坐標(biāo)軸,只能聲明多個(gè)axes,無法單獨(dú)聲明axis,所以代碼邏輯如下:
此處代碼,figure(),括號(hào)內(nèi)可以無輸入坐標(biāo)信息,因?yàn)楦鱾€(gè)figure之間是相互獨(dú)立的,figure內(nèi)部各對象之間相互無影響。也可以輸入任意數(shù)組。兩個(gè)對象的區(qū)分靠變量名實(shí)現(xiàn)。
從圖中一個(gè)x值對應(yīng)兩個(gè)y的值,說明這是兩個(gè)函數(shù)的疊加。該方式訪問十分復(fù)雜,非必要不要直接使用ax1對象訪問。此處僅做示意。
六、 多圖片布局
多個(gè)圖片之間布局,位置定位有兩種思路
- 絕對位置定位:用實(shí)際位置坐標(biāo)定位圖片位置
- 相對位置定位:用數(shù)組自動(dòng)將圖片切分成相同大小的行和列,根據(jù)行和列的位置定位。
1. 絕對坐標(biāo)布局法說明
Axes在figure容器內(nèi),就需要定義準(zhǔn)確的位置,距離左邊框的數(shù)值left,距離下邊框的bottom,axes自己的寬度width,axes自己的高度height。
Axes初始化時(shí),需要作為顯式參數(shù)傳值。
2. 絕對坐標(biāo)布局法實(shí)踐
3. 相對坐標(biāo)布局法說明
同一個(gè)畫布上可以分為多個(gè)模塊,分別作畫。
畫布的布局是用單元格的方式:
- 參數(shù)一:整個(gè)畫布有幾行
- 參數(shù)二:當(dāng)前行有幾列
- 參數(shù)三:當(dāng)前是第幾個(gè)子圖位置
十以內(nèi),2,1,1與211效果等同。
示意圖如下:
4. 絕對坐標(biāo)布局法實(shí)踐
七、 多圖片自動(dòng)切割
如圖,同一個(gè)figure導(dǎo)出的圖片是同一張,多個(gè)figure,每個(gè)figure都是獨(dú)立的一張圖片。
所以下面代碼兩個(gè)圖片導(dǎo)出是獨(dú)立的,axes的參數(shù)并不能影響兩個(gè)axes之間的排序,因?yàn)樗麄儾辉谝粋€(gè)容器里。
本文由 @我是產(chǎn)品張 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺(tái)僅提供信息存儲(chǔ)空間服務(wù)。
- 目前還沒評(píng)論,等你發(fā)揮!