使用Matplotlib
對分析結果視覺化時,比較各類分析結果是常見的場景。
在這類場景之下,將多個分析結果繪製在一張圖上,可以幫助使用者方便地組合和分析多個資料集,提高資料視覺化的效率和準確性。
本篇介紹Matplotlib
繪製子圖的常用方式和技巧。
新增子圖主要有兩種方式,
一種是函數式風格:(也就是上一篇畫布中介紹的方式)
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)
上面設定好子圖的佈局之後,新增子圖的順序是從上到下,從左到右。
子圖的佈局是按照行列設定的,設定之後,相應的位置可以新增子圖。
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
屬性來設定。
除了規則的網格佈局,還可以通過 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列的網格,但是不是每個圖形佔用幾個網格是可以調整的。
除了網格,還可以通過相對定位的方式來繪製多個子圖。
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個元素的含義:
注意,這裡的4個值都是比例。
Matplotlib
中的每個子圖可以有自己的標籤、大小、位置和樣式,可以方便地組合成一個複雜的圖形。
我們一般在下列場景中使用子圖: