python中的matplotlib.pyplot_python matplotlib中axes与axis的区别?
1.axes subplot axis
先說第一個(gè)疑惑 Axes - Subplot - Axis 之間到底是個(gè)什么關(guān)系?
因?yàn)槲沂桥υ诳从⑽牡慕坛?#xff0c;所以剛開始對axes和axis是基本搞不清的,一個(gè)是軸的復(fù)數(shù),一個(gè)是軸,好像設(shè)定圖像屬性的時(shí)候經(jīng)常用axes,具體到某個(gè)坐標(biāo)軸的時(shí)候才會(huì)用axis。然后教程還說,subplot和axes基本就是一個(gè)意思。真是坑坑坑。。。
扛不住,翻了翻中文教程,好像有的教程就直接把a(bǔ)xes翻譯成子圖了,好像這個(gè)世界就壓根沒有subplot和axes的區(qū)別。。看了半天,其實(shí)我還是覺得axes翻譯成軸域比較貼切,下面就結(jié)合后來看到的各種教程來講講自己最后的理解。
1.1 先明確Figure的概念
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
plt.show()
我們先理清figure的概念。用畫板和畫紙來做比喻的話,figure就好像是畫板,是畫紙的載體,但是具體畫畫等操作是在畫紙上完成的。在pyplot中,畫紙的概念對應(yīng)的就是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()
所以就算我們只有一個(gè)子圖,我們也可以生成一個(gè)subplot,然后來在對這個(gè)subplot對象進(jìn)行各種軸、標(biāo)注、刻度等的設(shè)定。
1.2 Axes 和 Subplot 的概念上細(xì)微的區(qū)別
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
print type(ax1)
plt.show()
第一個(gè)例子是用subplot()方法。
subplot()方法很好理解。里面?zhèn)魅氲娜齻€(gè)數(shù)字,前兩個(gè)數(shù)字代表要生成幾行幾列的子圖矩陣,底單個(gè)數(shù)字代表選中的子圖位置。這個(gè)例子中我們生成了2行1列的子圖矩陣。可以分別在兩個(gè)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()
第二個(gè)例子是用add_axes()方法。
我覺得軸域(Axes)的感念確實(shí)可以先理解成一些軸(Axis)的集合,當(dāng)然這個(gè)集合還有很多軸(Axis)的屬性,標(biāo)注等等。我們用add_axes()方法生成一個(gè)軸域(Axes),括號里面的值前兩個(gè)是軸域原點(diǎn)坐標(biāo)(從左下角計(jì)算的),后兩個(gè)是顯示坐標(biāo)軸的長度。當(dāng)我們生成了軸域的時(shí)候,從結(jié)果上看確實(shí)是生成了一個(gè)可以畫圖的子圖。我們可以分別在兩個(gè)軸域(Axes)中畫圖。
對比兩種方法,兩種對象,我們可以總結(jié)總結(jié):兩種對象確實(shí)是“你中有我,我中有你”的關(guān)系,生成子圖(subplot)的時(shí)候,必然帶著所謂的一套軸域(Axes)。而用軸域(Axes)方法,客觀上就是生成了一個(gè)可以畫圖的子圖。
add_subplot()方法在生成子圖過程,簡單明了,而用add_axes()方法,則生成子圖的靈活性更強(qiáng),完全可以實(shí)現(xiàn)add_subplot()方法的功能,可以控制子圖顯示位置,甚至實(shí)現(xiàn)相互重疊的效果。例如:
2 Axes方法與pyplot函數(shù)
用野路子法,也就是直接看代碼,不懂的就查文檔,看別人的代碼的時(shí)候,圖像的的各種特性經(jīng)常用兩套方法實(shí)現(xiàn),對學(xué)習(xí)過真是毀滅性打擊。所以遇到模仿的瓶頸的時(shí)候,還是要找些教程看看。這里基本照搬翻譯,https://github.com/matplotlib/AnatomyOfMatplotlib 教程中的Part1的 Axes methods vs. pyplot 一節(jié)。
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()
本次畫圖涉及到的兩步操作,畫圖和設(shè)定x軸的顯示范圍,分別用前后兩種方法實(shí)現(xiàn)。
第一種,調(diào)用了pyplot中的 plot() 函數(shù)和 xlim() 函數(shù),
第二種,使用了生成的Subplot對象的兩種方法 .plot 和 .set_xlim方法。
實(shí)際上,實(shí)現(xiàn)整個(gè)畫圖過程可以用兩套工具來分別實(shí)現(xiàn),其實(shí)這也是貫穿整個(gè)python編程的兩種思路,函數(shù)式編程和對象式編程。我們在這里可以比較一下兩套工具的優(yōu)缺點(diǎn):以 plot() 為代表的函數(shù)式操作,表達(dá)簡潔,但是沒有體現(xiàn)出真正畫圖的實(shí)現(xiàn)過程,例如甚至當(dāng)沒有搞清楚Figure Axes Subplot 等概念的時(shí)候,依然可以輕松的用pyplot函數(shù)畫圖。當(dāng)子圖較多的時(shí)候,對子圖的操作容易陷入混亂,因?yàn)閺拇a上并不能字節(jié)觀察出到底在操作那張子圖。
以 .plot 為代表的對象式操作,表達(dá)明確,分步生成 Figure 和 Axes/Subplot,操作過程直接可以看出是在那張子圖上操作。但是缺點(diǎn)就是,需要寫的代碼比較多,不夠簡潔。
這里要吐槽一下我看的這個(gè)教程,作者提出了在 PEP20 中,“Python之道”(The Zen of Python)提到了“明了勝于晦澀”(Explicit is better than implicit),所以作者在整個(gè)教程中都是使用了對象式的方法。但是其實(shí)”Python之道“的下一句就是“簡潔勝于復(fù)雜”(Complex is better than complicated)。
所以,還是看你的使用場景,假如不需要畫子圖的時(shí)候,用一用簡單的pyplot方法也沒什么不好。但是初學(xué)者最好還是能夠堅(jiān)持先使用Axes對象屬性的方法,這樣對于畫圖的實(shí)現(xiàn)過程可以加深理解。
參考資料:
總結(jié)
以上是生活随笔為你收集整理的python中的matplotlib.pyplot_python matplotlib中axes与axis的区别?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中使用什么注释语句和运算_P
- 下一篇: matplotlib 中文_详解Matp