matplotlib更舒服的subplots姿勢

1. figure和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
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章