1. 程式人生 > >matplotlib畫圖(二)——子圖

matplotlib畫圖(二)——子圖

在matplotlib有一個方法是subplot,可以實現在一張畫布中,存在多個子圖的情況。在同類資料比較分析的時候,這類圖表很受大家歡迎。

matplotlib.pyplot.subplot(*args, **kwargs)

使用方法:

subplot(nrows, ncols, index, **kwargs)
subplot(pos, **kwargs)
subplot(ax)

nrows表示行數,ncols表示列數,index表示第幾個(從上往下,從左往右數,最小值為1);這三個引數組合起來表示畫一幅nrows*ncols個子圖的圖。pos其實就是nrows、ncols、index的結合體,比如subplot(2,1,1)

其實與subplot(211)表述的是同一個意思。所不同的是,pos中三個數字的任意一個都不能大於10,但使用nrows, ncols, index就無此限制了。
以上一文的例子為例:

import matplotlib.pyplot as plt

# 第一組資料
x1 = list(range(5))
y1 = list(map(lambda x: x**2, x1))
# 第二組資料
x2 = list(range(4, 10))
y2 = list(map(lambda x: x**2/2, x2))
# 作一幅2*1的圖,選擇第1個子圖
ax1 = plt.subplot(211)
ax1.plot(x1, y1)
# 作一幅2*1的圖,選擇第2個字圖
ax2 = plt.subplot(212)
ax2.plot(x2, y2)
# 刪除子圖ax2
# plt.delaxes(ax2)
# 增加子圖ax2
# plt.subplot(ax2)
# 顯示圖
plt.show()

10

當某些條件下,不需要展示圖2時,可以使用delaxes實現:

# 刪除子圖ax2
plt.delaxes(ax2)

11
刪除後,又需要展示圖2時,可以使用subplot(ax)實現:

# 增加子圖ax2
plt.subplot(ax2)

調整上述程式碼:

#將第二幅圖的子圖排布做了調整
# ax2 = plt.subplot(212)
ax2 = plt.subplot(322)

子圖調整後,會以新的子圖佈局為準,由於找不到ax1標準的畫布佈局,此圖將不會展示,結果呈現為:
12

子圖的樣式調整引數如下:

屬性 描述
aspect 預設值為"auto",也可以為大於0的數(當數字大於0小於0.1時,數字越小,y軸被壓縮顯示的越嚴重;當數字大於0.1,數字越大,x軸被壓縮的越厲害)
anchor 預設值為“C”即居中的意思,是子圖位置的配置項,其他值還有:“SW”,“S”,"SE"等;當各個圖aspect都為“auto"的情況下,看不出來;
autoscale_on bool值,自動定位x、y座標,0為關閉,1為開啟;預設開啟
autoscalex_on bool值,自動定位x座標,0為關閉,1為開啟;預設開啟
autoscaley_on bool值,自動定位y座標,0為關閉,1為開啟;預設開啟
facecolor 顏色,子圖的顏色,可以用顏色的全稱,比如:yellow,blue 也可以用簡寫,y,b 分別代表黃顏色與藍顏色
fc 同facecolor,是其簡稱
frame_on bool值,邊框是否展示,預設為展示
visible bool值,子圖是否可見,預設為可見
xlabel 字串,x軸命名
ylabel 字串,y軸命名
xticklabels 列表(List[str]),設定x軸每一個座標的名稱
yticklabels 列表(List[str]),設定y軸每一個座標的名稱
xticks 列表(List),x軸設定柱;簡單來說就是給出座標,會在該座標點顯示該點位置
yticks 列表(List),y軸設定柱;簡單來說就是給出座標,會在該座標點顯示該點位置

效果圖(修改程式碼中的引數):

ax1 = plt.subplot(211, aspect=0.5)

13

ax1 = plt.subplot(211, aspect=0.5, anchor="W")

14

ax1 = plt.subplot(211, facecolor="yellow")

15

ax1 = plt.subplot(211, frame_on=0)

16

ax1 = plt.subplot(211, xlabel="x-name", ylabel="y_name")

17

ax1 = plt.subplot(211, xticklabels=["No.0","No.1","No.2","No.3","No.4"],
                    yticklabels=["No.0","No.1","No.2","No.3","No.4"])

18

ax1 = plt.subplot(211, xticks=[0.01, 1.0, 2.3, 3.5],
                  yticks=[0.01, 2.0, 5.3, 13.5])

19
更多引數見官網給出的文件:
110
111

本文參考文件:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplot.html#matplotlib.pyplot.subplot