Matplotlib for Beginners (3)|Matplotlib 的Figure、Axes 及 Subplots

by KC
0 comment

本系列第一篇文章(Matplotlib for Beginners (1)|Matplotlib 介紹、安裝、架構及支援圖表類型)中有提到,Matplotlib 主要有三層架構(Backend Layer、Artist Layer 及 Scripting Layer),其中在 Artist Layer 又有兩種主要型態:基本藝術家(Primitive Artist)組合藝術家(Composite Artist)。而組合藝術家(Composite Artist)這種容器類型裡面則有 3個非常重要的元素,分別是 Figure、Axes、Axis(如下圖)。

Figure、Axes/Subplot、Axis 架構圖
Figure、Axes/Subplot、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)

建立空畫布(Figure)
建立空畫布(Figure)

1.2 Figure 建立方式

  • 隱性方式

下方的程式碼執行 plt.subplot() 時,會判斷 Figure 物件是否存在,如果不存在,就會自動建立一個 Figure 物件,並且在這個 Figure 裡建立一個 Axes 座標系統。

範例 2:隱性方式建立 Figure

隱性方式建立 Figure
隱性方式建立 Figure
  • 顯性方式

當使用 figure() 方法來建立 Figure 時,則是另外一種能建立畫布的方式。同時可以繪製不同圖表,或針對 Figure 進行更細部的操作與設定。

範例 3:顯性方式建立 Figure

顯性方式建立 Figure
顯性方式建立 Figure

1.3 Figure 常用參數

下表顯示了 幾個 Figure 常用附加參數提供讀者參考。

Figure 常用參數
Figure 常用參數

現在我們就來使用這些參數來做做幾個範例練習。

範例 4:建立含圖表標題 Figure

我們利用上面介紹的 figure() 方式來建立一個含圖表標題的 Figure。

建立含圖表標題的 Figure
建立含圖表標題 Figure

範例 5:使用參數客製化 Figure

此範例我們使用參數 figsize 來調整畫布大小,facecolor 設定畫布顏色,edgecolor 設定畫布邊框顏色,以及使用 linewidth 設定畫布外框寬度。

使用 frameon 參數控制 Figure
使用 frameon 參數控制 Figure

範例 6:使用 frameon 參數控制 Figure

我們可以試著使用參數 frameon 來顯示 Figure 外框和背景色,若設定 False 時則表示不顯示。

讀者不難發現在上述範例中有關顏色的設定,我們可以使用 Matplotlib 認識的 color name(如下圖),也可以使用16 進位表示方式進行設定。如果讀者想要查看有哪些 color name 可以使用時,可以參考 Matplotlib 官提供的資料。下圖圈起來的顏色就是筆者使用的畫布顏色。

Matplotlib 支援的顏色命名清單
Matplotlib 支援的顏色命名清單 (https://matplotlib.org/stable/gallery/color/named_colors.html)

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) 。

Figure、Axes(Subplots)、Axis 關係圖
Figure、Axes(Subplots)、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 左邊框的距離比例、下方框的距離比例、寬度比及高度比例,可參考下圖。

Matplotlib 圖形及座標系統(Figure/Axes)建立基本架構

透過這種方式添加 Axes 時,Matplotlib 會自動建立一個 Axes,然後將建立好的 Axes 按照給定的位置和尺寸添加到 Figure 中。

範例 7:使用 plt.axes() 建立 Axes

使用 plt.axes() 建立 Axes
使用 plt.axes() 建立 Axes
  • fig.add_axes()

在物件導向的介面中,plt.axes() 此指令相當於是 fig.add_axes()。主要是將一個 Axes 添加到 Figure 中。

範例 8:使用 fig.add_axes() 建立 Axes

使用 fig.add_axes() 建立 Axes
使用 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 位置及排列順序。

plt.subplot() 子圖建立架構
plt.subplot() 子圖建立架構

範例 9:使用 plt.subplot() 建立 Axes (I)

使用 plt.subplot() 建立 Axes
使用 plt.subplot() 建立 Axes

另外要提醒的是每一次在使用 plt.subplot() 方法時,只會在指定索引的子網格中建立 axes,而不是在所有子網格中都建立 axes。另外,如果三個主要參數 (nrows, ncols, index)都小於 10 時,可以將三個參數合併為一個 3 位數來寫,例如 plt.subplot(2, 2, 1)plt.subplot(221)是一樣的。我們來看看下面另外一個範例。

範例 10:使用 plt.subplot() 建立 Axes (II)

使用 plt.subplot() 建立 Axes
使用 plt.subplot() 建立 Axes
  • plt.subplots()

在建立大型子圖網格時,尤其是若有想要隱藏內部座標圖上的 x 軸和 y 軸標籤需求時,那前面所描述的方法就變成較為繁雜及乏味。因此,另一個 plt.subplots() 方法將會是較容易使用的工具(請留意 subplots 末尾需加 s)。

plt.subplot() 不同的是,plt.subplots() 不是一次只建立單一子圖,而是在一行程式碼中建立多個且完整的子圖表,並以 NumPy 陣列傳回它們。其方法是透過設定列數(nows)、行數(ncols) 兩個參數先建立子圖表的二維陣列,接著在指定位置中繪製子圖表,另外也可使用關鍵字 sharexsharey 來指定設置是否共享 x 軸及 y 軸。

例如,下面範例我們試著使用 plt.subplots() 來建立一個 2×2 的子圖表,並且同一行(col)中的所有軸共享其 x 軸刻度,而同一列(row)中的所有軸共享其 y 軸刻度。

範例 11:使用 plt.subplots() 建立 Axes (I)

使用 plt.subplots() 建立 Axes
使用 plt.subplots() 建立 Axes

範例 12:使用 plt.subplots() 建立 Axes (II)

我們也可以利用一些屬性(例如設定子圖標題、移除 x 軸及 y 軸刻度等等)來客製化子圖。

使用 plt.subplots() 建立 Axes
使用 plt.subplots() 建立 Axes

其中我們通常會將下面這種寫法

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

使用 plt.GridSpec() 建立 Axes
使用 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 也會不定期提供國內外教育與科技新知。

Related Posts

Leave a Comment

error: Content is protected !!