【matplotlib基礎】--子圖

2023-09-01 12:00:40

使用Matplotlib對分析結果視覺化時,比較各類分析結果是常見的場景。
在這類場景之下,將多個分析結果繪製在一張圖上,可以幫助使用者方便地組合和分析多個資料集,提高資料視覺化的效率和準確性。

本篇介紹Matplotlib繪製子圖的常用方式和技巧。

1. 新增子圖的方式

新增子圖主要有兩種方式,
一種是函數式風格:(也就是上一篇畫布中介紹的方式)

import numpy as np

import matplotlib
import matplotlib.pyplot as plt

%matplotlib inline

x = np.array(range(0, 8))

fig = plt.figure(figsize=[6,4])
fig.add_subplot(211) # 2行1列的第一個
y = np.random.randint(1, 100, 8)
plt.plot(x, y)

fig.add_subplot(212) # 2行1列的第二個
y = np.random.randint(1, 100, 8)
plt.plot(x, y)

另一種是物件導向風格:(使用 Axes 物件)

x = np.array(range(0, 8))

fig, ax = plt.subplots(1, 2)  # 設定子圖1行2列
y = np.random.randint(1, 100, 8)
ax[0].plot(x, y)

y = np.random.randint(1, 100, 8)
ax[1].plot(x, y)

上面設定好子圖的佈局之後,新增子圖的順序是從上到下,從左到右。

2. 子圖的佈局

子圖的佈局是按照行列設定的,設定之後,相應的位置可以新增子圖。

x = np.array(range(0, 8))
rows, cols = 2, 2  # 2行2列,4個子圖
fig, ax = plt.subplots(rows, cols)

for i in range(rows):
    for j in range(cols):
        y = np.random.randint(1, 100, 8)
        ax[i, j].plot(x, y) # i,j定位子圖的位置


子圖按照網格佈局時,我們看到上面4個子圖的Y軸刻度不一樣,這樣不利於比較。

x = np.array(range(0, 8))
rows, cols = 2, 2  # 2行2列,4個子圖
fig, ax = plt.subplots(rows, cols, sharey='all')

for i in range(rows):
    for j in range(cols):
        y = np.random.randint(1, 100, 8)
        ax[i, j].plot(x, y) # i,j定位子圖的位置


設定 sharey='all'之後,Y軸刻度保持一致,這樣比較曲線才有意義。
上面的範例中 X軸刻度是一致的,如果不一致,可以用 sharex 屬性來設定。

3. 複雜的佈局

3.1. 不規則的網格

除了規則的網格佈局,還可以通過 GridSpec 設定不規則的網格。
比如:

rows, cols = 3, 3
grid = plt.GridSpec(rows, cols)

plt.subplot(grid[0, :2])
plt.subplot(grid[0, 2])

plt.subplot(grid[1, 0])
plt.subplot(grid[1, 1:])

plt.subplot(grid[2, :])


上例中設定了3行3列的網格,但是不是每個圖形佔用幾個網格是可以調整的。

3.2. 巢狀圖形

除了網格,還可以通過相對定位的方式來繪製多個子圖。

fig = plt.figure()

fig.add_axes([0.1, 0.1, 1, 1])
fig.add_axes([0.3, 0.3, 0.3, 0.3])
fig.add_axes([0.7, 0.6, 0.3, 0.2])


上面按相對位置新增子圖的函數 add_axes的引數是一個4元列表
這個列表4個元素的含義:

  1. 第一個元素表示子圖左下角距離畫布左邊的距離佔畫布總寬度的比例
  2. 第二個元素表示子圖左下角距離畫布底邊的距離佔畫布總高度的比例
  3. 第三個元素表示子圖寬度佔畫布總寬度的比例
  4. 第三個元素表示子圖高度佔畫布總高度的比例

注意,這裡的4個值都是比例

4. 總結回顧

Matplotlib 中的每個子圖可以有自己的標籤、大小、位置和樣式,可以方便地組合成一個複雜的圖形。
我們一般在下列場景中使用子圖:

  1. 資料視覺化:將多個資料集在同一張圖中顯示,進行對比和分析。
  2. 圖表組合:將多個圖表組合在一起,形成一個綜合性的圖形。
  3. 資料分析:將多個資料集在同一張圖中顯示,進行篩選和篩選。
  4. 視覺化規範化:將多個來源不同的資料集在同一張圖中顯示,保證圖形的一致性和準確性。