建立多個子圖表 ( subplot、subplots )
使用 matplotlib 建立 figure 後,能透過 subplot() 和 subplots() 的方法,在同一張圖片裡建立多個子圖表,這篇教學將會介紹如何建立多個子圖表。
快速導覽
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
子圖表的位置
使用 subplot() 或 subplots() 的方法建立子圖表時,會按照 row ( 垂直 )、column ( 水平 ) 的矩陣方式,將子圖表放入對應的位置,下圖表示擁有 3x3 和 3x2 個子圖表的畫布,各個子圖表的 index ( 位置 ) 和排列順序。
subplot 和 subplots 的差異
subplot(row, column, index)
建立單一個子圖表,可以透過設定 nrows ( 垂直 )、ncols ( 水平 ) 和 index ( 位置 ) 參數,將子圖表放在畫布中指定的位置,使用時必須注意,同一張畫布裡 subplot() 方法的 row 和 column 設定必須相同,下方的例子會畫出兩個子圖表 ( 221 可以寫成 2,2,1,表示 nrows 2、ncols 2、index 1 )。
import matplotlib.pyplot as plt x = [1,2,3,4,5] y = [5,4,3,2,1] fig = plt.figure() plt.subplot(221) plt.plot(x) plt.subplot(224) plt.plot(y) plt.show()
如果不設定參數,預設畫出「一張」子圖表。
import matplotlib.pyplot as plt x = [1,2,3,4,5] y = [5,4,3,2,1] fig = plt.figure() plt.subplot() plt.plot(x) plt.show()
subplots()
建立多個子圖表,可以透過設定 nrows 和 ncols 參數建立子圖表的二維陣列,接著就能在指定的位置繪製子圖表,下方的例子會畫出兩個子圖表。
import matplotlib.pyplot as plt x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots(2,2) ax[0][0].plot(x) ax[1][1].plot(y) plt.show()
如果不設定參數,預設畫出「一張」子圖表。
import matplotlib.pyplot as plt x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots() ax.plot(x) plt.show()
使用 add_subplot
如果建立了一個空白的 figure,也可以透過 add_subplot() 的方法,將子圖表添加到畫布裡指定的位置,add_subplot() 的用法和 subplot() 類似,添加時需要設定 nrows、ncols 和 index 參數,下方的例子會畫出兩個子圖表。
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [5,4,3,2,1]
fig = plt.figure()
fig.add_subplot(221)
plt.plot(x)
fig.add_subplot(224)
plt.plot(y)
plt.show()
設定子圖表的間距
建立子圖表後,預設會按照規劃的位置排列,但如果子圖表裡包含了 title 或客製化的軸線格式,可能會發生位置重疊的狀況,為了避免這些情況,matplotlib 提供下列幾種調整子圖表的方法:
tight_layout()
使用 tight_layout() 方法後,子圖表會自動保持合適的間距。
x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots(2,2) ax[0,0].set_title('xxx') ax[0,0].plot(x) ax[1,1].set_title('yyy') ax[1,1].plot(x) plt.tight_layout() plt.show()
subplots_adjust()
使用 tight_layout() 方法後,可以根據使用者的設定,調整子圖表的間距,tight_layout() 具有 left、right、bottom、top 四個比例參數,wspace 和 hspace 兩個子圖表空間參數。
x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots(2,2) ax[0,0].set_title('xxx') ax[0,0].plot(x) ax[1,1].set_title('yyy') ax[1,1].plot(x) plt.subplots_adjust(hspace=1, wspace=0.5, left=0.2) plt.show()
subplot_tool()
subplot_tool() 會開啟一個可調整的視窗 ( 需要 GPU 支援,Colab 會開啟靜態圖片 ),可從上方看到目前子圖表的間距設定。
x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots(2,2) ax[0,0].set_title('xxx') ax[0,0].plot(x) ax[1,1].set_title('yyy') ax[1,1].plot(x) plt.subplot_tool() plt.show()
建立子圖表時,加入 constrained_layout=True
在建立子圖表時,加入 constrained_layout=True 參數,就會在產生子圖表前,調整到最合適的位置。
x = [1,2,3,4,5] y = [5,4,3,2,1] fig, ax = plt.subplots(2,2,constrained_layout = True) ax[0,0].set_title('xxx') ax[0,0].plot(x) ax[1,1].set_title('yyy') ax[1,1].plot(x) plt.show()
跨欄或跨列的圖表
使用 subplot2grid() 方法,可以建立「跨欄」或「跨列」的圖表,subplot2grid() 有下列幾個常用的參數:
|參數|說明| |shape|圖表的大小,以 (int, int) 表示。| |loc|圖表的起始位置,以 (int, int) 表示。| |rowspan|圖表的跨列數值,預設 1。| |colspan|圖表的跨欄數值,預設 1。|
下方的程式碼執行後,除了兩個 1x1 的圖表,還會有一個 2x2 的圖表出現在畫布裡。
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [5,4,3,2,1]
fig = plt.figure()
plt.subplot2grid((3,3), (0, 1), rowspan=2, colspan=2)
# (3,3), (0, 1) 等同 (332)
plt.plot(x)
plt.subplot(331)
plt.plot(x)
plt.subplot(339)
plt.plot(y)
plt.show()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~