Matplotlib for Beginners (2)|Matplotlib 圖表結構剖析 (Figure Anatomy)

by KC
0 comment

Matplotlib 是一個大型專案,對初學者來說有時乍看之下會令人畏懼,但透過系統性學習 Matplotlib 中的繪圖構成組件,對使用者來說將會是更簡單、更平易近人的學習方式。

在開始將我們的數據視覺化於圖表之前,需要先處理一個明顯的問題:一個圖表的實際組成部分是什麼?本篇文章先不深入探討不同類型的圖表細節,而是提供一個對使用 Python 和圖表(基本)元素可以創建的不同圖表的簡要介紹。

儘管有各式各樣的圖表類型,但其中有一些元素是大多數圖表(不是全部)都共通的。因此,了解基本術語在學習使用 Matplotlib 是非常有用的,因為這將使您在開始建立或修改自己的圖表時,更容易在網路上或官網尋找幫助和正確資訊。

Matplotlib 各式圖表
Matplotlib 各式圖表

1. 圖表主體結構

在使用 Matplotlib 進行繪圖之前,理解 Matplotlib 圖表結構是非常必要的。Matplotlib 圖表有三個非常重要的概念,分別是 Figure、Axes 及 Axis。三者之間的關係構成了 Matplotlib 圖表的整體布局及主體結構。我們先看看下方簡圖來說明這三者間的關係

Figure、Axes/Subplot、Axis 架構圖
Figure、Axes/Subplot、Axis 架構圖

我們先針對 FigureAxes Axis 做簡單的介紹,下一篇文章將會利用許多範例做更詳細的說明

  • Figure:”Figure” 是這個層次結構中的頂層容器。它是總體的視窗/頁面,所有內容都會繪製在其上。使用者可以擁有多個獨立的圖形(figures),而一個 “Figure” 可以包含多個 “Axes”。因此你可以將 “Figure” 理解為是一個畫布。
  • Axes:大多數繪圖發生在 “Axes” 上。”Axes” 實際上是我們繪製數據和與之相關的刻度、標籤等的區域。通常,我們會透過調用 subplot(將 “Axes” 放在規則網格上)來設置 “Axes”,因此在大多數情況下,”Axes” 和 “Subplot” 是同義詞。所以我們也可以將 “Axes” 視為是一個座標系統。
  • Axis:每個 “Axes” 都有一個 X 軸 (X axis)和一個 Y 軸 (Y axis),它們包含刻度、刻度位置、標籤等等。所以我們可以將 “Axis” 視為是座標系統中的座標軸。

在本篇文章中,我們將主要透過其他機制來控制刻度、刻度標籤和數據限制,因此我們不會觸及太多單個軸部分的事物。

範例 1:建立 Fingue

本篇文章中,我們將使用以下的導入語句,而這些縮寫在某種程度上是標準化的,大多數學習教程和其他 Python 程式碼也會使用它們。

import numpy as np
import matplotlib.pyplot as plt

現在讓我們開始建立一個圖形(Figure)。本範例使用淡黃色的顏色(#FFFFDD 十六進位表示)來顯示畫布區域。然後使用 plt.show() 來顯示圖。

目前什麼事都沒有發生!只顯示一塊黃色圖形(畫布)。這是因為預設情況下 Matplotlib 不會顯示任何內容,除非被告知要怎麼做。我們可以試著透過參數 figsize 來控制圖形的大小,此參數需要一個以 (width, height) 英吋為單位的元組(Tuple),例如下面範例 2。

範例 2:調整 Fingue 大小

範例 3:建立 Axes

在 Matplotlib 中所有繪圖都是相對於一個 Axes 進行的,而一個 Axes 會由 Axis 物件和許多其他元素組成。其中一個 Axes 物件必須屬於一個 Figure(並且只能屬於一個 Figure)。使用者所使用的大多數命令都將與此 Axes 物件有關。

通常,我們會先設置一個 Figure (也就是畫布大小),然後向其添加一個 Axes (座標系統)。在 Matplotlib 中可以使用fig.add_axes (下一篇文章將有詳細說明),但在大多數情況下,您會發現添加一個 subplot 會容易滿足您的需求。(溫馨小提醒,”subplot” 只是一個基於網格(Grid)系統的 Axes。)

在上面範例 3 中,我們注意到對 set 的呼叫。Matplotlib 的物件通常有很多”explicit setters”(明確設置器)。也就是說,這些函數會以 set_<something> 做為開頭,並且來控制特定的選項。

為了展示這一部份,讀者可以在 Jupyter Notebook 程式碼單元中輸入 ax.set_,然後按下 <Tab> 鍵。您將看到以 set 開頭的 Axes 方法的長列表。

我們試著將範例 3 的第四行改寫成如下:

因此,Matplotlib 的 set 方法非常方便,不僅適用於 Axes,同時幾乎可適用於所有 Matplotlib 物件。

了解圖表主體結構的三個重要部分(Figure、Axes 及 Axis)彼此之間的關係,接著就讓我們來看看在 Matplotlib 中圖表結構的細部剖析 (Figure Anatomy)。

2. 圖表結構剖析 (Figure Anatomy)

下圖是 Matplotlib Figure 的組成部分。

2.1 常用繪圖術語

這些常用術語可能會有所不同,具體情況取決於您使用的繪圖庫。此處提供的列表,是以使用 Matplotlib 中繪圖的典型術語(請參見上圖)。

  • Major tick label:座標軸上的主刻度標籤(例如文字或值)
  • Minor tick label:座標軸上的次刻度標籤(例如文字或值)
  • Major tick:座標軸上的主刻度
  • Minor tick:座標軸上的次刻度
  • xlabel: x座標軸的標籤名稱
  • ylabel: y座標軸的標籤名稱
  • Title:圖標題。
  • Line:線
  • Markers:標記
  • Grid:Axes 座標系統上的網格
  • Legend:圖例
  • Axes:座標系統
  • Figure:圖形
  • x Axis: x 座標軸。若是 3D繪圖,圖形座標系統(Axes),則會是 x Axis、y Axis、z Axis。
  • y Axis: y 座標軸。若是 3D繪圖,圖形座標系統(Axes),則會是 x Axis、y Axis、z Axis。
  • Spine :座標系統框

3. 工作流程 (Workflow)

用 Matplotlib 創建新圖時,可參考下列基本步驟及範例:

我們就以下面例子帶讀者走過一遍

Step 1:準備資料 (Prepare Data)

我們先導入 matplotlib

import matplotlib.pyplot as plt

然後準備資料下列資料

x = [1, 2, 3, 4, 5]
y = [5, 10, 20, 35, 45]  

Step 2:建立繪圖 (Create Plot)

在此步驟可以建立繪圖(Figure)。建立繪圖時,讀者可以參考前面所提參數部分(例如調整畫布大小、畫布顏色等等)。本範例主要介紹此工作流程,暫時不加這些參數,留待讀者自行練習。

fig = plt.figure()  

Step 3:客製化繪圖 (Customize Plot)

我們可以在此畫布上規劃子圖數量及格局(子圖操作部分在下一篇文章會詳細介紹)。本範例建立一個子圖(subplot(111)的意思是建立1列、1行的子圖,並且編號為1,細節可留待後續圖文詳細說明),並且在其座標軸上做一些客製化,包括刻度、顏色、線寬、標記圖形等等。

ax = fig.add_subplot(111)     # Step 3
plt.plot(x, y, color='blue', linewidth=2, marker='o') # Step 3
plt.xlim(1, 5.5)   

Step 4:儲存繪圖 (Save Plot)

在 Matplotlib 中可以使用 savefig() 方法來儲存繪圖,儲存方式是以 Figure 為儲存單位。並且可存成 png、jpg、gif、svg、eps等圖檔格式。

plt.savefig('workflow.png') 

Step 5:圖形展示 (Show Plot)

最後將其繪圖展示出來。

plt.show() 

結合上面這些步驟可完成下面範例練習。

範例 4:工作流程範例

經由本文介紹後,相信讀者對 Matplotlib 的圖表結構(Figure、Axes、Axis)有了基本認識,接下來我們將介紹一系列 Matplotlib 學習文章給有所有對使用 Python 進行視覺化有興趣的初學者。

讀者若想要多了解一些 Python 的基本程式語法,可以參考 Python for Beginners 系列文章,裡面有大量範例及 Quiz 練習。若是想要了解一些 AI 機器學習及深度學習的基礎概念,可以參考這一本書【從 AI 到 生成式 AI:40 個零程式的實作體驗,培養新世代人工智慧素養】,它將帶領讀者不會程式、不會數學也OK!的情況下,建立最完整的 AI 入門知識。

如果你喜歡這篇文章歡迎訂閱、分享(請載名出處)追蹤,並持續關注最新文章。同時 FB 及 IG 也會不定期提供國內外教育與科技新知。

Related Posts

Leave a Comment

error: Content is protected !!