1. 程式人生 > >python使用matplotlib subplot繪製多個子圖

python使用matplotlib subplot繪製多個子圖

                            

1  問題描述

matploglib 能夠繪製出精美的圖表, 有些時候, 我們希望把一組圖放在一起進行比較, 有沒有什麼好的方法呢?

matplotlib 中提供的 subplot 可以很好的解決這個問題

2 subplot函式介紹

matplotlib下, 一個 Figure 物件可以包含多個子圖(Axes), 可以使用 subplot() 快速繪製, 其呼叫形式如下 :

subplot(numRows, numCols, plotNum)
  • 1
  • 圖表的整個繪圖區域被分成 numRows 行和 numCols

  • 然後按照從左到右,從上到下的順序對每個子區域進行編號,左上的子區域的編號為1

  • plotNum 引數指定建立的 Axes

    物件所在的區域

如果 numRows = 2, numCols = 3, 那整個繪製圖表樣式為 2X3 的圖片區域, 用座標表示為

(1, 1), (1, 2), (1, 3)(2, 1), (2, 2), (2, 3)
  • 1
  • 2

這時, 當 plotNum = 3 時, 表示的座標為(1, 3), 即第一行第三列的子圖

  • 如果 numRows, numColsplotNum 這三個數都小於 10 的話, 可以把它們縮寫為一個整數, 例如 subplot(323)subplot(3,2,3) 是相同的.

  • subplotplotNum 指定的區域中建立一個軸物件. 如果新建立的軸和之前建立的軸重疊的話,之前的軸將被刪除.

3 示例程式

3.1  規則劃分成3*3的

#!/usr/bin/env python#!encoding=utf-8import matplotlibimport matplotlib.pyplot as pltif __name__ == '__main__':    for i,color in enumerate("rgby"):        plt.subplot(221+i, axisbg=color)    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

figure_1

3.2 不規則劃分

但是有時候我們的劃分並不是規則的, 比如如下的形式

figure_2

這種應該怎麼劃分呢?

將整個表按照 2*2 劃分 前兩個簡單, 分別是 (2, 2, 1)

(2, 2, 2)

但是第三個圖呢, 他佔用了 (2, 2, 3)(2, 2, 4)

顯示需要對其重新劃分, 按照 2 * 1 劃分

前兩個圖佔用了 (2, 1, 1) 的位置

因此第三個圖佔用了 (2, 1, 2) 的位置

figure_3

#!/usr/bin/env python#!encoding=utf-8import matplotlib.pyplot as pltimport numpy as npdef f(t):    return np.exp(-t) * np.cos(2 * np.pi * t)if __name__ == '__main__' :    t1 = np.arange(0, 5, 0.1)    t2 = np.arange(0, 5, 0.02)    plt.figure(12)    plt.subplot(221)    plt.plot(t1, f(t1), 'bo', t2, f(t2), 'r--')    plt.subplot(222)    plt.plot(t2, np.cos(2 * np.pi * t2), 'r--')    plt.subplot(212)    plt.plot([1, 2, 3, 4], [1, 4, 9, 16])    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26