python matplotlib中axes與axis的區別?
一直搞不明白這兩者的區別,中文意思都是坐標軸的意思?
1.axes subplot axis先說第一個疑惑 Axes - Subplot - Axis 之間到底是個什麼關係?
因為我是努力在看英文的教程,所以剛開始對axes和axis是基本搞不清的,一個是軸的複數,一個是軸,好像設定圖像屬性的時候經常用axes,具體到某個坐標軸的時候才會用axis。然後教程還說,subplot和axes基本就是一個意思。真是坑坑坑。。。
扛不住,翻了翻中文教程,好像有的教程就直接把axes翻譯成子圖了,好像這個世界就壓根沒有subplot和axes的區別。。看了半天,其實我還是覺得axes翻譯成軸域比較貼切,下面就結合後來看到的各種教程來講講自己最後的理解。
1.1 先明確Figure的概念
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
plt.show()
我們先理清figure的概念。用畫板和畫紙來做比喻的話,figure就好像是畫板,是畫紙的載體,但是具體畫畫等操作是在畫紙上完成的。在pyplot中,畫紙的概念對應的就是Axes/Subplot。
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title="An Example Axes", ylabel="Y-Axis", xlabel="X-Axis")
plt.show()
所以就算我們只有一個子圖,我們也可以生成一個subplot,然後來在對這個subplot對象進行各種軸、標註、刻度等的設定。
1.2 Axes 和 Subplot 的概念上細微的區別
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
print type(ax1)
plt.show()
第一個例子是用subplot()方法。
subplot()方法很好理解。裡面傳入的三個數字,前兩個數字代表要生成幾行幾列的子圖矩陣,底單個數字代表選中的子圖位置。這個例子中我們生成了2行1列的子圖矩陣。可以分別在兩個subplot中畫圖。
fig = plt.figure()
ax3 = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax4 = fig.add_axes([0.72, 0.72, 0.16, 0.16])
print type(ax3) plt.show()
第二個例子是用add_axes()方法。
我覺得軸域(Axes)的感念確實可以先理解成一些軸(Axis)的集合,當然這個集合還有很多軸(Axis)的屬性,標註等等。我們用add_axes()方法生成一個軸域(Axes),括弧裡面的值前兩個是軸域原點坐標(從左下角計算的),後兩個是顯示坐標軸的長度。當我們生成了軸域的時候,從結果上看確實是生成了一個可以畫圖的子圖。我們可以分別在兩個軸域(Axes)中畫圖。
對比兩種方法,兩種對象,我們可以總結總結:
- 兩種對象確實是「你中有我,我中有你」的關係,生成子圖(subplot)的時候,必然帶著所謂的一套軸域(Axes)。而用軸域(Axes)方法,客觀上就是生成了一個可以畫圖的子圖。
- add_subplot()方法在生成子圖過程,簡單明了,而用add_axes()方法,則生成子圖的靈活性更強,完全可以實現add_subplot()方法的功能,可以控制子圖顯示位置,甚至實現相互重疊的效果。例如:
2 Axes方法與pyplot函數用野路子法,也就是直接看代碼,不懂的就查文檔,看別人的代碼的時候,圖像的的各種特性經常用兩套方法實現,對學習過真是毀滅性打擊。所以遇到模仿的瓶頸的時候,還是要找些教程看看。這裡基本照搬翻譯,https://github.com/matplotlib/AnatomyOfMatplotlib 教程中的Part1的 Axes methods vs. pyplot 一節。
plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color="lightblue", linewidth=3)
plt.xlim(0.5, 4.5)
plt.show()
fig = plt.figure()
ax = fig.add_subplot(111)
print type(ax)
ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color="lightblue", linewidth=3) ax.set_xlim(0.5, 4.5)
plt.show()
本次畫圖涉及到的兩步操作,畫圖和設定x軸的顯示範圍,分別用前後兩種方法實現。
第一種,調用了pyplot中的 plot() 函數和 xlim() 函數,
第二種,使用了生成的Subplot對象的兩種方法 .plot 和 .set_xlim方法。
實際上,實現整個畫圖過程可以用兩套工具來分別實現,其實這也是貫穿整個python編程的兩種思路,函數式編程和對象式編程。我們在這裡可以比較一下兩套工具的優缺點:
- 以 plot() 為代表的函數式操作,表達簡潔,但是沒有體現出真正畫圖的實現過程,例如甚至當沒有搞清楚Figure Axes Subplot 等概念的時候,依然可以輕鬆的用pyplot函數畫圖。當子圖較多的時候,對子圖的操作容易陷入混亂,因為從代碼上並不能位元組觀察出到底在操作那張子圖。
- 以 .plot 為代表的對象式操作,表達明確,分步生成 Figure 和 Axes/Subplot,操作過程直接可以看出是在那張子圖上操作。但是缺點就是,需要寫的代碼比較多,不夠簡潔。
這裡要吐槽一下我看的這個教程,作者提出了在 PEP20 中,「Python之道」(The Zen of Python)提到了「明了勝於晦澀」(Explicit is better than implicit),所以作者在整個教程中都是使用了對象式的方法。但是其實」Python之道「的下一句就是「簡潔勝於複雜」(Complex is better than complicated)。
所以,還是看你的使用場景,假如不需要畫子圖的時候,用一用簡單的pyplot方法也沒什麼不好。但是初學者最好還是能夠堅持先使用Axes對象屬性的方法,這樣對於畫圖的實現過程可以加深理解。
參考資料:
- https://github.com/matplotlib/AnatomyOfMatplotlibgithub上的教程
- https://www.datacamp.com/community/tutorials/matplotlib-tutorial-python#gs.alh6j1c Datacamp中帶運行環境的教程
作者:禹洋同學 微信公眾號:practice_yuyang
Python科學計算數據可視化模塊-Matplotlib,這篇博客好像講到點
axis顧名思義就是軸。
axes簡單說來就是靈活的子圖。和Subplot的關係看官網上axes的說明,很清楚了:
Most of you are probably familiar with the Subplot, which is just a special case of an Axes that lives on a regular rows by columns grid of Subplot instances. If you want to create an Axes at an arbitrary location, simply use the add_axes() method which takes a list of [left, bottom, width, height] values in 0-1 relative figure coordinates:
附鏈接:Artist tutorial - Matplotlib 2.0.2 documentation
難道不是axis單數 axes複數嗎。。。。。。
axes是坐標系,axis是坐標軸
axes翻譯成子圖可能更恰當一些,axis就是軸。
推薦閱讀:
※Matplotlib 如何畫散點圖的圖例?
※如何用簡單的演算法生成一個類似『光碟』的彩色圓形圖片?
TAG:Python | Matplotlib |