Matplotlib做圖工具核心框架邏輯梳理

0 評論 1581 瀏覽 1 收藏 12 分鐘

本文簡要介紹Matplotlib做圖工具的系統架構,文章使用類圖簡要梳理Matplotlib的核心架構思路,立足于洞察工具的核心架構邏輯,支撐工具的日常使用。并對畫布的四層級容器的作用和使用做演示說明。

一、概要架構圖

用計算機工具做圖,是現實世界中畫畫,本質需要準備的東西是一致的,主要包括畫圖工具和畫布兩大模塊。

二、畫圖工具

1. 畫圖工具說明

畫圖工具就是各種筆,鉛筆、水彩筆、刷子、顏料等,每種工具發揮的作用各有不同。

matplotlib采用面向對象設計架構,設計中肯定借鑒了該思路。區別是計算機程序不能完全對照現實的對象構建程序。

現實中,畫家雖然需要準備各種畫筆,但是最終有價值的是畫家涂鴉的各種形狀、色彩、布局等,畫筆、顏料等只是實現涂鴉的手段。

計算機畫圖,本質是操作各種數字的變化涂鴉,所以畫圖工具,只需要構建各種可以用來組裝的基本圖形、顏色的積木和拼裝平臺即可。

下圖中的rectangel、circle、line2d、axesimage等就是可供拼接的積木。window、figure、axes、axis就是積木拼接的平臺。

2. 畫圖工具類圖

按照面向對象的思想,大部分的架構都會劃分為工具區和應用區。此處工具區的包括各種形狀的定義、顏色、線條等。

三、 圖像載體

畫布屬于圖像載體,圖像載體還包括其他間接載體,硬盤也是圖像載體。

1. 圖像載體說明

有了畫圖工具,接下來就需要畫布?,F實生活中可以在墻上、紙上、沙地上,各種載體都可以作為畫布。顯然,畫在墻上,別人想參觀,只能到現場,畫到紙上,可以把紙帶給別人,畫在沙地上,風吹就會消失。

只有所承載的容器能被更大的容器容納,能實現儲存、運輸、交換,這個載體才是好載體。

為了使圖畫能支撐更多的移動、組合,matplotlib使用了四層容器。

2. 圖像載體類圖

3. 載體承載關系圖

容器承載的邏輯生活中到處都是:餅干密封到包裝袋、然后一起包裝到盒子、箱子里,裝到運載車輛里,車輛在地球上,地球在宇宙中…

使用容器承載,就需要以對容器指定坐標系,用以確定承載物的位置關系。比如袋子裝餅干、杯子接水,只是這種承載非常直觀,我們并未顯式的聲明容器的位置關系。只有特別大的東西才會聲明坐標系,比如地球的經緯度坐標系。

在計算機世界里,所有的東西都需要人工構建出來,所以所有的容器都需要聲明坐標系。小到數值,大到對象、模塊、應用程序,只是隨著軟件的發展,直接面向內存編碼的任務更多的交給計算機軟件自動執行了。

Matplotlib做圖工具核心框架邏輯梳理

四、 單坐標系構圖

雖然,容器層層包裝的情況是普遍的,但是各個容器之間的關系并不是均等的,比如雖然餅干經過若干層的包裝,但是只有餅干本身才是營養的最終承載者,其余的塑料包裝、盒包裝、箱包裝、到汽車車廂等,其他所有的容器的意義都是為了方便餅干的保存、交易、運輸等功能。

Axes在這四個包裝容器的地位如同餅干相對于盒、箱、車廂包裝的意義。

Axes是容器的核心,所有的畫圖工具都可以通過該對象直接訪問,雖然axis是最小的容器,但是脫離Axes對象,Axis對象無法單獨發揮作用。

1. 單坐標圖的默認效果

如下圖,坐標系的橫坐標為:(-10,10)與函數x的區間完全一致。

該圖使用x的數值邊界作為坐標系x軸邊界,此處(-10,10)被用作axis的默認值。

此種訪問邏輯,沒有顯式的聲明window、figure、axes、axis并不表示他們不存在,pyplot是用裝飾器模式,將這四個對象的細節隱藏起來了,可以極大減少參數的輸入,降低使用的復雜度。

Matplotlib做圖工具核心框架邏輯梳理

2. 單坐標圖調增坐標系范圍

axis是坐標軸有兩個軸,x軸和y軸的大小是分別調節實現的。

調整后的坐標軸和x,y的范圍不一致了。該方式可以用于調整查看圖形的視角。

Matplotlib做圖工具核心框架邏輯梳理

Matplotlib做圖工具核心框架邏輯梳理

對比可知,兩條曲線從數值上看是完全相同的,但是坐標系的大小不同,可觀察的視覺就不同。

3. 單坐標系疊加多圖

如代碼所示,如果仍然僅適用默認的axes,多個疊加的圖,只能共享同一個坐標系。

Matplotlib做圖工具核心框架邏輯梳理

Matplotlib做圖工具核心框架邏輯梳理

五、多坐標系疊加多圖

疊加多坐標軸圖片時,必須顯式的聲明figure、axes,否則無法實現。

window不需要顯式聲明是因為,代碼執行時系統會自動聲明,每次執行就是一個window。

axis不需要顯式聲明是因為,axis與axes是一對一對應的并且是聚合關系,聲明axes時,系統會自動聲明axis。

figure、axes必須手動聲明是因為,他們與父類都是組合關系,他們與父類組合時,需要每個子類以對象的維度單獨聲明。

由于figure、axes需要單獨聲明,所以需要輸入的參數較多,非必要不要使用該方式。

此處要使用多個坐標軸,只能聲明多個axes,無法單獨聲明axis,所以代碼邏輯如下:

Matplotlib做圖工具核心框架邏輯梳理

Matplotlib做圖工具核心框架邏輯梳理

此處代碼,figure(),括號內可以無輸入坐標信息,因為各個figure之間是相互獨立的,figure內部各對象之間相互無影響。也可以輸入任意數組。兩個對象的區分靠變量名實現。

從圖中一個x值對應兩個y的值,說明這是兩個函數的疊加。該方式訪問十分復雜,非必要不要直接使用ax1對象訪問。此處僅做示意。

六、 多圖片布局

多個圖片之間布局,位置定位有兩種思路

  1. 絕對位置定位:用實際位置坐標定位圖片位置
  2. 相對位置定位:用數組自動將圖片切分成相同大小的行和列,根據行和列的位置定位。

1. 絕對坐標布局法說明

Matplotlib做圖工具核心框架邏輯梳理

Axes在figure容器內,就需要定義準確的位置,距離左邊框的數值left,距離下邊框的bottom,axes自己的寬度width,axes自己的高度height。

Axes初始化時,需要作為顯式參數傳值。

Matplotlib做圖工具核心框架邏輯梳理

Matplotlib做圖工具核心框架邏輯梳理

2. 絕對坐標布局法實踐

Matplotlib做圖工具核心框架邏輯梳理

Matplotlib做圖工具核心框架邏輯梳理

3. 相對坐標布局法說明

同一個畫布上可以分為多個模塊,分別作畫。

畫布的布局是用單元格的方式:

  • 參數一:整個畫布有幾行
  • 參數二:當前行有幾列
  • 參數三:當前是第幾個子圖位置

十以內,2,1,1與211效果等同。

示意圖如下:

Matplotlib做圖工具核心框架邏輯梳理

4. 絕對坐標布局法實踐

Matplotlib做圖工具核心框架邏輯梳理

Matplotlib做圖工具核心框架邏輯梳理

七、 多圖片自動切割

如圖,同一個figure導出的圖片是同一張,多個figure,每個figure都是獨立的一張圖片。

所以下面代碼兩個圖片導出是獨立的,axes的參數并不能影響兩個axes之間的排序,因為他們不在一個容器里。

Matplotlib做圖工具核心框架邏輯梳理

Matplotlib做圖工具核心框架邏輯梳理

Matplotlib做圖工具核心框架邏輯梳理

本文由 @我是產品張 原創發布于人人都是產品經理。未經許可,禁止轉載

題圖來自Unsplash,基于CC0協議

該文觀點僅代表作者本人,人人都是產品經理平臺僅提供信息存儲空間服務。

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發揮!