文章目錄
本系列第一篇文章(Matplotlib for Beginners (1)|Matplotlib 介紹、安裝、架構及支援圖表類型)中有提到,Matplotlib 主要有三層架構(Backend Layer、Artist Layer 及 Scripting Layer),其中在 Artist Layer 又有兩種主要型態:基本藝術家(Primitive Artist) 和組合藝術家(Composite Artist)。而組合藝術家(Composite Artist)這種容器類型裡面則有 3個非常重要的元素,分別是 Figure、Axes、Axis(如下圖)。
當我們使用 Matplotlib 繪製圖表時,必經流程會先建立好 Figure(畫布),接著由 Figure 去建立一個或著多個 Axes (座標系統),然後經由 Axes 使用各種方法來添加你所想要的基本元素,同時也透過 Axes 獲取 Axis 來實現各種細節操控。因此,簡而言之,繪圖中的 Figure 和 Axes 這兩個元素構成 Matplotlib 使用時的重要基礎。
將一張圖的架構簡單解析如上圖時,當中圖形 (Figure) 包含並管理圖中的許多元素,而主要架構則會決定將圖形與行為分開。本篇文章將接續前幾篇內容,深入淺出的介紹這些重要的架構元素,未來則會以此為基礎介紹許多繪圖應用。
1. Figure
1.1 Figure
簡介
在 Matplotlib 中,Figure 是所有繪圖元素的頂層容器。您可以將 Figure 視為一個「畫布」,表示 Matplotlib 繪製圖表的空間。
在繪製圖表時,要先創建一個畫布,才能在其加入各種元素。另外在儲存或輸出圖片時,也都是以 Figure 為單位進行。
我們可以透過從 pyplot
模組呼叫 figure()
函式來實例化 Figure 物件。
import matplotlib.pyplot as plt
fig = plt.figure()
此時將會看到創建一個空畫布(Figure)及其預設大小,同時尚未建立任何座標系統 (Axes)。
<Figure size 432x288 with 0 Axes>
在 Jupyter Notebook 的程式碼單元中執行後的結果如下圖。
範例 1:建立空畫布(Figure
)
1.2 Figure
建立方式
- 隱性方式
下方的程式碼執行 plt.subplot()
時,會判斷 Figure 物件是否存在,如果不存在,就會自動建立一個 Figure 物件,並且在這個 Figure 裡建立一個 Axes 座標系統。
範例 2:隱性方式建立 Figure
- 顯性方式
當使用 figure()
方法來建立 Figure 時,則是另外一種能建立畫布的方式。同時可以繪製不同圖表,或針對 Figure 進行更細部的操作與設定。
範例 3:顯性方式建立 Figure
1.3 Figure
常用參數
下表顯示了 幾個 Figure 常用附加參數提供讀者參考。
現在我們就來使用這些參數來做做幾個範例練習。
範例 4:建立含圖表標題的 Figure
我們利用上面介紹的 figure()
方式來建立一個含圖表標題的 Figure。
範例 5:使用參數客製化 Figure
此範例我們使用參數 figsize
來調整畫布大小,facecolor
設定畫布顏色,edgecolor
設定畫布邊框顏色,以及使用 linewidth
設定畫布外框寬度。
範例 6:使用 frameon
參數控制 Figure
我們可以試著使用參數 frameon
來顯示 Figure 外框和背景色,若設定 False
時則表示不顯示。
讀者不難發現在上述範例中有關顏色的設定,我們可以使用 Matplotlib 認識的 color name(如下圖),也可以使用16 進位表示方式進行設定。如果讀者想要查看有哪些 color name 可以使用時,可以參考 Matplotlib 官網提供的資料。下圖圈起來的顏色就是筆者使用的畫布顏色。
2. Axes
2.1 Axes
簡介
Axes 是建立資料視覺化的一個閘道(gateway),並且是具有資料空間的影像區域。一旦在圖形(Figure)上放置了一個 Axes,就有許多方法可將數據添加到 Axes 上。一個給定的圖形(Figure)中可以包含多個 Axes,但給定的 Axes 物件則只能在一個圖形(Figure)中。
你可以將 Axes 視為一個「座標系統」,每一個 Axes 「座標系統」都可以視為是 Figure 的一個子圖(Subplot),子圖的建立方式有很多種,我們會在後面介紹這一部分。
Axes 通常具有一對定義數據座標系統的 Axis Artists,並包含用於添加標註的方法,例如 x 和 y 標籤(labels)、標題(titles)和圖例(legends)。Axes 如果是二維圖表,將會包含兩個座標軸(axis)。如果是三維圖表,Axes 則會包含三個座標軸(axis),依此類推。
下圖呈現 1 張圖(Figure)、2 個座標系統(Axes)。每一個座標系統(Axes)都有 1 組 Axis 座標 (X axis 和 Y axis) 。
2.2 Axes
建立方式
一張 Figure 上可以有多個子圖(Subplots),而每一個子圖上都會有座標圖 Axes,因此我們可以將 Axes 視為是 Figure 畫布上的子圖(Subplots)。由於一個 Figure 可以有多個 Axes (如上圖),無論是 pyplot
模組還是 figure
實例都可以定義多種建立 Axes 的方法。現在就讓我們依序介紹給大家。
plt.axes()
plt.axes()
是指 pyplot
模組中使用 axes()
方法,此方法會在目前 Figure 中建立 Axes。
建立 Axes (座標系統) 的最基本方法是使用該 plt.axes()
。正如之前範例所看到的,在預設情況下,將會建立一個填充整個 Figure 圖形的標準 Axes 物件。同時 plt.axes()
也採用一個參數,它是圖形座標系統中四個數字的串列 (List),這些數字在圖形座標系中表示 [left, bottom, width, height]
,範圍從圖形左下角的 0 到圖形右上角的 1,分別表示與 Figure 左邊框的距離比例、下方框的距離比例、寬度比及高度比例,可參考下圖。
透過這種方式添加 Axes 時,Matplotlib 會自動建立一個 Axes,然後將建立好的 Axes 按照給定的位置和尺寸添加到 Figure 中。
範例 7:使用 plt.axes()
建立 Axes
fig.add_axes()
在物件導向的介面中,plt.axes()
此指令相當於是 fig.add_axes()
。主要是將一個 Axes 添加到 Figure 中。
範例 8:使用 fig.add_axes()
建立 Axes
plt.subplot()
接下要介紹 2 個快速建立 Axes 的方法:plt.subplot()
及 plt.subplots()
。這兩種都是在 pyplot
模組中所定義的方法,並且都是將 figure
劃分為多列多行的網格,然後再進行添加 axes
。但功能和用法有些許的不同。
當使用 plt.subplot()
或 plt.subplots()
方法來建立子圖時,會按照 row (橫列數)、column (垂直行) 的安排方式,將子圖表放入對應的位置。例如 plt.subplot()
會有三個主要參數 (nrows, ncols, index)
,分別表示列數(nows)
、行數(ncols)
和索引(index)
。該方法會根據指定的列數及行數對 figure
進行網格劃分,然後在指定索引位置的網格中建立 axes
。
索引是從 1 開始並且由左往右,由上往下的遞增,例如下圖表示 figure 擁有格局為 2x3
的子圖表(axes/subplots),並且顯示各個子圖表的 index 位置及排列順序。
範例 9:使用 plt.subplot()
建立 Axes
(I)
另外要提醒的是每一次在使用 plt.subplot()
方法時,只會在指定索引的子網格中建立 axes
,而不是在所有子網格中都建立 axes
。另外,如果三個主要參數 (nrows, ncols, index)
都小於 10 時,可以將三個參數合併為一個 3 位數來寫,例如 plt.subplot(2, 2, 1)
與 plt.subplot(221)
是一樣的。我們來看看下面另外一個範例。
範例 10:使用 plt.subplot()
建立 Axes
(II)
plt.subplots()
在建立大型子圖網格時,尤其是若有想要隱藏內部座標圖上的 x 軸和 y 軸標籤需求時,那前面所描述的方法就變成較為繁雜及乏味。因此,另一個 plt.subplots()
方法將會是較容易使用的工具(請留意 subplots
末尾需加 s
)。
與 plt.subplot()
不同的是,plt.subplots()
不是一次只建立單一子圖,而是在一行程式碼中建立多個且完整的子圖表,並以 NumPy 陣列傳回它們。其方法是透過設定列數(nows)
、行數(ncols)
兩個參數先建立子圖表的二維陣列,接著在指定位置中繪製子圖表,另外也可使用關鍵字 sharex
和 sharey
來指定設置是否共享 x
軸及 y
軸。
例如,下面範例我們試著使用 plt.subplots()
來建立一個 2×2
的子圖表,並且同一行(col)
中的所有軸共享其 x
軸刻度,而同一列(row)
中的所有軸共享其 y
軸刻度。
範例 11:使用 plt.subplots()
建立 Axes
(I)
範例 12:使用 plt.subplots()
建立 Axes
(II)
我們也可以利用一些屬性(例如設定子圖標題、移除 x
軸及 y
軸刻度等等)來客製化子圖。
其中我們通常會將下面這種寫法
fig = plt.figure()
ax = fig.add_subplot(111)
改寫為下面寫法,內容都一樣但比較簡潔。
fig, ax = plt.subplots()
plt.GridSpec()
當使用者的子圖需要跨網格的方式來跨越多列或多行時,那 plt.GridSpec()
會是是不錯的方法。plt.GridSpec()
物件本身不會建立子繪圖,它只是一個可以被前面所提到的 plt.subplot()
命令所識別介面。例如,若要具有指定高度是兩列高,寬度是三行寬的平面網格的 gridspec ,其寫法如下所示(當中 wspace 及 hspace 分別表示子圖間水平及垂直的空間)。
grid = plt.GridSpec(2, 3, wspace = 0.5, hspace = 0.5)
我們可以使用熟悉的 Python 切片語法來指定子圖位置和範圍。有關 Python 相關資訊可以參考 Python for Beginners。
範例 13:使用 plt.GridSpec()
建立 Axes
經由本文介紹後,學習到如何使用 Matplotlib 在同一個圖形上建立多個子繪圖,探索了 plt.axes()
、 fig.add_axes()
、 plt.subplot()
、plt.subplots()
等多種建立 Axes 的使用方法。相信讀者對 Matplotlib 的 Figure、Axes 及 Subplots 有了更進一步的認識,接下來我們將介紹一系列 Matplotlib 學習文章給有所有對使用 Python 進行視覺化有興趣的初學者。
讀者若想要多了解一些 Python 的基本程式語法,可以參考 Python for Beginners 系列文章,裡面有大量範例及 Quiz 練習。若是想要了解一些 AI 、機器學習及深度學習的基礎概念,可以參考這一本書【從 AI 到 生成式 AI:40 個零程式的實作體驗,培養新世代人工智慧素養】,它將帶領讀者在不會程式、不會數學也OK!的情況下,建立最完整的 AI 入門知識。
如果你喜歡這篇文章歡迎訂閱、分享(請載名出處)與追蹤,並持續關注最新文章。同時 FB 及 IG 也會不定期提供國內外教育與科技新知。