1. figure和axes
- figure是作圖的畫布 : matplotlib.figure.Figure
- 你可以在figure上面鋪展axes, 事實上, 你畫的圖其實都是畫在axes上的 : matplotlib.pyplot.axes
以下展示一下兩者關係:
plt.figure(facecolor='cyan');
plt.gcf().subplots(2,2);
image.png
注: 水藍色就是figure, 帶數字框框就是axes
瀏覽兩者的api, 你會發現, figure的大部分功能, 都是和普通的圖像屬性以及鋪展axes相關的. 而觀察axes的api, 你會發現它是科學作圖的代理, 有條形圖, 散點圖, 折線圖等等的豐富強大的功能, axes其實是在一幅畫布上, 規劃出的一個個科學作圖的座標軸系統
2. 很多教程中的plt.<某種圖像類型>
做了什麼
初學之時, 我們常常會用, plt.plot()
, plt.scatter()
, plt.bar()
等等函數來畫圖, 不過這些函數的本質還是在axes上作圖, 它們做的事情你可以理解爲
- 首先得到當前活躍的axes, 如果當前figure上還沒有axes, 就幫你創建一個axes, 然後將它設爲當前活躍的axes
- 調用這個當前axes上的各個作圖功能.
這裏有兩個重要的函數:
plt.gcf() # 意爲, get current figure
plt.gca() # 意爲, get current axes
所以, 一些初級教程教的plt.<blablabla>
中其實有不少相當於plt.gca().<blablabla>
, 它們很快能夠看到效果, 但是到了我們需要複雜地鋪展子圖的時候, 它們就不好用了, 不過現在理解了axes
其實是作圖的基本代理之後, 我們就能對整件事有更多把握了.
3. 在figure上自由地鋪展axes並獲取它們!
首先, 我造一些玩具數據
foo = ['a','b','c']
bar = [1,2,3]
第一招:
_, axes = plt.subplots(2,2, figsize=(6, 6)) # 第一個參數是創建的figure
axes[0][0].bar(foo, bar);
axes[0][1].scatter(bar, bar);
axes[1][0].plot(bar, bar);
axes[1][1].pie(bar);
image.png
plt.subplots(2,2, figsize=(6, 6))
會創建一個新的figure, 然後在這個figure上面鋪展2x2一共4個axes, 然後返回figure以及axes, 這些axes能夠直接通過索引獲取, 所以你可以輕易地將它寫到循環中:
_, axes = plt.subplots(2,2, figsize=(6, 6))
colors = ['r', 'g', 'b', 'k']
for ax, c in zip(axes.flatten(), colors):
ax.plot(bar, bar, c=c)
image.png
這一招我自己最常用, 子圖可以作爲一個新的維度存在, 用來組織數據中取值範圍比較少的離散維度, 比如禮拜幾這類
第二招
這招就定製化比較高了, 我自己用得比較少, 具體來說, 它可以做出這樣的佈局
image.png
它的代碼如下:
plt.subplot(3,1,1)
plt.subplot(3,3,4)
plt.subplot(3,3,5)
plt.subplot(3,3,6)
plt.subplot(3,1,3)
格式爲plt.subplot(<行數>, <列數>, <序號>)
, 以上代碼創建了一個3x3的佈局, 3x3的佈局是能夠和3x1的佈局耦合的, 只要將3x3的第一行的三個子圖合成一個長條就OK. 對應的代碼就是plt.subplot(3,1,1)
和plt.subplot(3,1,3)
它們都是返回axes的, 所以你可以
ax1 = plt.subplot(3,1,1)
ax1.plot(bar, bar)
不過, 每次調用完plt.subplot(...)
之後, 新產生的axes會變成當前axes, 因此可以:
plt.subplot(3,1,1)
plt.plot(bar, bar)
plt.subplot(3,3,4)
plt.plot(bar, bar)
...
第三招!
還是一樣, 鋪展axes, 然後獲取這些axes作圖, 這次你可以做出這樣的:
image.png
怎麼做的呢? 經過上面的作圖原理介紹, 這一次, matplotlib的文檔你應該能直接看明白了, 直接傳送:
https://matplotlib.org/users/gridspec.html
4. 爲什麼我要關注axes?
axes能夠幫助我們實現定點作圖, 一些非常受歡迎的庫, 比如pandas和seaborn, 它們大部分的作圖函數都有一個叫ax
的參數, 用來控制圖最終出現在哪個axes上. 毫不誇張地說, 我個人對於matplotlib的操控感就是從瞭解了這個基本的作圖機制開始的😝
5. 總結
如果你
- 明白了matplotlib的作圖機制
- 明白了鋪展axes並定位到每個axes進行作圖的方法
- 想要回去自己嘗試
就給我個❤️吧, 哈哈哈~
作者:事重
鏈接:https://www.jianshu.com/p/ec2dcd35d826