原文章一:https://zhuanlan.zhihu.com/p/93423829,原文章二:https://jishuin.proginn.com/p/763bfbd23e20 感謝作者的講解
plt.***
和ax.***
的區別
- 在matplotlib中,有兩種畫圖方式:
- plt.figure(): plt.***系列。通過plt.xxx來畫圖。這是通過matplotlib提供的一個api,這個plt提供了很多基本的function可以讓你很快的畫出圖來,但是如果你想要更細致的精調,就要使用另外一種方法。第一種方式的代碼來看,先生成了一個
Figure
畫布,然后在這個畫布上隱式生成一個畫圖區域進行畫圖。
plt.figure(1) plt.subplot(211) plt.plot(A,B) plt.show()
- fig, ax = plt.subplots(): 正統的稍微復雜一點。指定figure和axes,然后對axes單獨操作。
第二種方式同時生成了
Figure
和axes
兩個對象,然后用ax
對象在其區域內進行繪圖如果從面向對象編程(對理解
Matplotlib
繪圖很重要)的角度來看,顯然第二種方式更加易於解釋,生成的fig
和ax
分別對畫布Figure
和繪圖區域Axes
進行控制,第一種方式反而顯得不是很直觀,如果涉及到子圖零部件的設置,用第一種繪圖方式會很難受。在實際繪圖時,也更推薦使用第二種方式。
fig, ax = plt.subplots()
ax.plot(A,B)
名詞解釋 in matplotlib
- Figure
fig = plt.figure()
: 可以解釋為畫布。 - 畫圖的第一件事,就是創建一個畫布figure,然后在這個畫布上加各種元素。
- Axes
ax = fig.add_subplot(1,1,1)
: 不想定義,沒法定義,就叫他axes! - 首先,這個不是你畫圖的xy坐標抽!
- 可以把axes理解為你要放到畫布上的各個物體。比如你要畫一個太陽,一個房子,一個車在畫布上,那么太陽是一個axes,房子是一個axes,etc。
- 如果你的figure只有一張圖,那么你只有一個axes。如果你的figure有subplot,那么每一個subplot就是一個axes
- axes是matlibplot的宇宙中心!axes下可以修改編輯的變量非常多,基本上能包含你的所有需求。
- Axis
ax.xaxis/ax.yaxis
: 對,這才是你的xy坐標軸。 - 每個坐標軸實際上也是由豎線和數字組成的,每一個豎線其實也是一個axis的subplot,因此
ax.xaxis也存在axes
這個對象。對這個axes進行編輯就會修改xaxis圖像上的表現。
圖像的各個部位名稱
User Guide 借個圖。
一步一步來,用傳統方法畫個圖
捏個數據
import matplotlib.pyplot as plt import numpy as np A = np.arange(1,5) B = A**2 C = A**3 print(A,B,C)
鋪個畫布
這個function創建了一個大小為(14,7)的畫布,把這個畫布賦值給變量fig,同時在這個畫布上創建了一個axes,把這個axes賦值給ax。這樣,所有未來fig.xxx都是對這個畫布的操作,所有ax.xxx都是對這個axes的操作。
如果你有兩個圖,那么ax是一個有兩個元素ax[0],ax[1] 的list。ax[0]就對應第一個subplot的ax。
fig, ax = plt.subplots(figsize=(14,7)) # fig, ax = plt.subplots(2,1,figsize(14,7)) # ax[0].*** # ax[1].***
畫數據
在這個axes上畫數據,因此就用ax.plot()來畫。畫完第一個再call一次,再畫第二個。
下面開始細節的處理
數據畫好了就可以各種細調坐標軸啊,tick啊之類的。
首先把標題和xy坐標軸的標題搞定。Again, 不用plt。直接在axes上進行設定。
ax.set_title('Title',fontsize=18) ax.set_xlabel('xlabel', fontsize=18,fontfamily = 'sans-serif',fontstyle='italic') ax.set_ylabel('ylabel', fontsize='x-large',fontstyle='oblique') ax.legend()
然后是xy坐標軸的一些屬性設定, 也是在axes level上完成的
ax.set_aspect('equal') ax.minorticks_on() ax.set_xlim(0,16) ax.grid(which='minor', axis='both')
最后是坐標軸tick和細節,這個在axes.xaxis or axes.yaxis上完成。
ax.xaxis.set_tick_params(rotation=45,labelsize=18,colors='w') start, end = ax.get_xlim() ax.xaxis.set_ticks(np.arange(start, end,1)) ax.yaxis.tick_right()
subplot的繪制加深
下面通過介紹subplots
加深對第二種繪圖方式的理解
假如現在我要在一張紙上左邊畫一個折線圖,右邊畫一個,該如何畫呢?
首先要有一個畫布Figure
,其次,需要有兩個區域Axes
(等價於兩個子圖subplot
)來畫圖
# 生成畫布和axes對象 # nrows=1和ncols=2分別代表1行和2列 fig,ax = plt.subplots(nrows=1,ncols=2)
因為這里有兩個畫圖區域,所以ax
對應的是一個列表,存儲了兩個Axes
對象。
然后分別控制左邊和右邊的繪圖區域進行繪圖
fig,ax = plt.subplots(nrows=1,ncols=2) ax[0].plot([1,2,3],[4,5,6])#折線圖 ax[1].scatter([1,2,3],[4,5,6])#散點圖