↑ 關注 + 星标 ~ 有趣的不像個技術号
每晚九點,我們準時相約

大家好,我是黃同學
我們之前已經講述了matplotlib的繪圖原理,陸續會更新繪圖技巧、相關圖形繪制。
《matplotlib繪圖的核心原理》
《matplotlib繪圖技巧詳解(一)》
《matplotlib繪圖技巧詳解(二)》
1、繪圖區域設定
繪圖區域設定:為figure指定不同的axes區域。
我們可以在一張圖上繪制多個圖形,當然,我們也可以将不同的圖形繪制到多個不同的區域當中。共有如下幾3種方式來實作繪圖區域的設定。
- 通過figure對象調用add_subplot方法。
- 通過plt的subplot方法。
- 通過plt的subplots方法。
1)figure對象的add_subplot方法使用說明
首先需要顯示的建立一個figure對象,通過調用figure對象的add_subplot方法,來配置設定不同的子繪圖區域。通俗的來說,就是相當于得到一個"畫闆對象",然後在這個畫闆上,配置設定出不同的子繪圖區域,每個區域可以繪制不同的圖形。
add_subplot指定繪圖布局,需要指定子繪圖區域的行數、列數和目前要繪制的子區域。
add_subplot方法會傳回每個子繪圖區域的對象,調用該對象即可實作在子區域的圖形繪制。
在繪制圖形時,總是需要建立figure對象。如果沒有顯式建立,則plt會隐式建立一個figure對象。在繪制圖形時,既可以使用plt來繪制,也可以使用子繪圖對象來繪制。“如果使用plt對象繪制,則總是在最後建立的繪圖區域上進行繪制。”
操作如下:
figure = plt.figure()
axes1 = figure.add_subplot(2, 1, 1, facecolor="#eeeeee")
axes2 = figure.add_subplot(2, 1, 2)
plt.plot([1,2],[4,8])
複制
結果如下:
① figure對象的add_subplot方法常用參數說明
- add_subplot指定繪圖布局:既可以使用三個參數分開傳遞,也可以使用一個參數整體傳遞。
- 使用facecolor設定繪圖區域的背景色。
- plt.subplots_adjust方法可以用來調整子圖與子圖之間的距離。(left,right,top,bottom,wspace,hspace)
② add_subplot指定繪圖布局與facecolor設定繪圖區域的背景色
figure = plt.figure()
axes1 = figure.add_subplot(2, 1, 1, facecolor="#eeeeee")
axes1.plot([1,2],[4,8])
axes2 = figure.add_subplot("212")
axes2.plot([1,8],[4,2])
複制
結果如下:
③ plt.subplots_adjust方法調整子圖與子圖之間的距離
figure = plt.figure()
axes1 = figure.add_subplot("221",facecolor="#eeeeee")
axes1.plot([1,2],[4,8])
axes2 = figure.add_subplot("222")
axes2.plot([1,8],[4,2])
axes3 = figure.add_subplot("223")
axes3.plot([1,2],[4,8])
axes4 = figure.add_subplot("224",facecolor="#eeeeee")
axes4.plot([1,8],[4,2])
# hspace和wspace參數最有用,隻講述這個
plt.subplots_adjust(hspace=1,wspace=0.5)
複制
結果如下:
3)plt的subplot方法的使用說明
plt.subplot方法,由于plt可以隐式的建立一個figure對象,是以使用這個方法,來指定繪圖布局,不需要顯示的建立figure對象。因為plt.subplot方法直接可以傳回子繪圖區域的axes對象。
實際上,這種建立子繪圖區域的方式,底層也是通過第一種方式實作的。
是以,使用這種方式和add_subplot的使用方式,一模一樣。
① 示範如下
plt.subplot("121")
plt.plot([1, 2, 3], "g--d")
plt.subplot(1, 2, 2)
plt.plot([2, 4, 1], "r-.o")
plt.subplots_adjust(wspace=0.5)
複制
結果如下:
4)plt的subplots方法的使用說明
通過plt的subplots方法建立子繪圖區域,該方法傳回一個元組。如果是一個子繪圖對象,那麼傳回的是一個axes坐标系對象。如果是多個子繪圖對象,則傳回一個ndarray數組。
可以通過sharex與sharey來指定是否共享x軸與y軸。
操作如下:
figure,axes = plt.subplots(1,1)
display(type(figure))
display(type(axes))
figure,axes = plt.subplots(2,2)
display(type(figure))
display(type(axes))
複制
結果如下:
① 不使用sharex與sharey共享x軸與y軸
figure,axes = plt.subplots(2,2)
axes[0,0].plot([1,4])
axes[0,1].plot([6,2])
axes[1,0].plot([3,7])
axes[1,1].plot([8,4])
複制
結果如下:
② 使用sharex與sharey共享x軸與y軸
figure,axes = plt.subplots(2,2,sharex=True,sharey=True)
axes[0,0].plot([1,4])
axes[0,1].plot([6,2])
axes[1,0].plot([3,7])
axes[1,1].plot([8,4])
複制
結果如下:
2、figure(畫布)大小設定
1)為什麼要設定figure(畫布)大小?
figure(畫布)的大小,對于我們進行圖形繪制很重要。
如果畫布太小,當子繪圖區域較多,可能會有些擁擠。是以我們要使用較大一點的畫布,才能更好的擺放這些子圖。
2)figure(畫布)大小設定的2種方式
在調用plt.figure()顯示建立figure對象時,通過figsize參數指定,機關為英寸。
在建立figure對象後,可以通過figure對象的set_size_inches方法設定。
① 在顯示建立figure對象的同時,通過figsize參數指定畫布大小
plt.figure(figsize=(8,3))
plt.plot([1,3,5,7],[4,9,6,8],"r-.o")
複制
結果如下:
② 在顯示建立figure對象後,通過set_size_inches()方法指定畫布大小
figure = plt.figure()
figure.set_size_inches(7,6)
plt.plot([1,3,5,7],[4,9,6,8],"r-.o")
複制
結果如下:
3)若隐式建立畫布,怎麼設定figure畫布大小呢?
① 示範如下
figure = plt.gcf()
figure.set_size_inches(6,5)
plt.plot([1,3,5,7],[4,9,6,8],"g-o")
複制
結果如下:
3、标簽與刻度設定
1)使用說明
我們可以通過plt對象的相關方法來設定或擷取标簽與刻度等資訊。
設定還是擷取,取決于是否傳遞實際參數。當傳遞了參數,表示設定标簽與刻度;當沒有傳遞參數,表示擷取标簽與刻度。
2)标簽與刻度設定的相關方法
- plt.xlim 設定或擷取x軸刻度範圍。
- plt.ylim 設定或擷取y軸刻度範圍。
- plt.xticks 設定或擷取x軸顯示的刻度與标簽。
- plt.yticks 設定或擷取y軸顯示的刻度與标簽。
- plt.axis 可以同時設定或擷取x與y軸的刻度範圍,或者是取消刻度顯示
- equal:x與y具有同樣的長度。
操作如下:
plt.plot([1, 3, 5], [2, 4, 6])
# 顯示x軸刻度的範圍
display(plt.xlim())
# 顯示y軸刻度的範圍
display(plt.ylim())
# 擷取x軸的刻度與标簽。
display(plt.xticks())
# 擷取y軸的刻度與标簽。
display(plt.yticks())
複制
結果如下:
3)x軸和y軸刻度範圍的設定:plt.xlim()、plt.ylim()
plt.plot([1,3,5,7],[4,9,6,8],"r.-")
plt.xlim([1,7])
plt.ylim(4,9)
複制
結果如下:
4)x軸和y軸刻度與标簽的設定:plt.xticks()、plt.yticks()
預設情況下,标簽就是我們設定的刻度資訊。我們可以自定義每個刻度的顯示标簽。
plt.plot([2, 4, 8], [4, 7, 5], "b-o")
plt.xlim([-2, 12])
plt.xticks([2, 4, 8], ["偏低", "中等", "偏高"])
複制
結果如下:
5)plt.axis()方法的使用
plt.axis 可以同時設定或擷取x與y軸的刻度範圍,或者是取消刻度顯示。
- 無參數:傳回一個元組。(xmin, xmax, ymin, ymax)
- (xmin, xmax, ymin, ymax) 同時設定x與y軸的刻度範圍。
- off 取消坐标軸顯示。
- tight:坐标軸緊湊顯示。
- equal:x與y具有同樣的長度。
① 擷取x與y軸的刻度範圍
plt.plot([2, 4, 8], [4, 7, 5], "b-o")
plt.axis()
複制
結果如下:
② 設定x與y軸的刻度範圍
plt.plot([2, 4, 8], [4, 7, 5], "b-o")
plt.axis((2,8,4,7))
複制
結果如下:
③ 去掉坐标軸:plt.axis(“off”)
plt.plot([2, 4, 8], [4, 7, 5], “b-o”)
plt.axis(“off”)
複制
結果如下:
④ 設定x軸和y軸每個機關長度大小一緻:plt.axis(“equal”)
plt.plot([2, 4, 8], [4, 7, 5], "b-o")
plt.axis("off")
複制
結果如下:
4、坐标軸标題、标簽與圖示題設定
1)坐标軸标題、标簽與圖示題設定的相關說明
關于本章知識的講解,我們從兩方面進行說明。
當一張figure畫布上,隻有一個圖的時候,通過如下方式設定:
- plt.xlabel 設定x軸的标簽說明。
- plt.ylabel 設定y軸的标簽說明。
- plt.xticks 設定x軸的刻度标簽。
- plt.yticks 設定y軸的刻度标簽。
- plt.title 設定标題。
當一張figure畫布上,有多個圖形的時候,通過如下方式設定,除了通過plt對象外,我們還可以通過子繪圖對象來設定與擷取标簽與刻度。
- ax.set_xlim 設定x軸刻度範圍。
- ax.get_xlim 擷取x軸刻度範圍。
- ax.set_xticks 設定x軸顯示的刻度。
- ax.get_xticks 擷取x軸顯示的刻度。
- ax.set_xticklabels 設定x軸顯示的刻度标簽。預設顯示的是就是刻度值。
- ax.get_xticklabels 擷取x軸顯示的刻度标簽。預設顯示的是就是刻度值。
也可以設定标簽說明與标題
- ax.set_xlabel 設定x軸的标簽說明。
- ax.get_xlabel 擷取x軸的标簽說明。
- ax.set_title 設定标題。
- ax.get_title 擷取标題。
說明:
- “如果需要設定或者擷取y軸,隻需要将x換成y即可。”
2)一張figure畫布上,隻有一個圖,怎麼設定坐标軸标題、标簽與圖示題?
plt.plot([2, 4, 8], [4, 7, 5], "b-o")
plt.xticks([2,4,8],["低","中","高"])
plt.xlabel("x軸标簽")
plt.ylabel("y軸标簽")
plt.title("圖示題")
複制
結果如下:
3)一張figure畫布上,有多個圖形,怎麼設定坐标軸标題、标簽與圖示題?
figure = plt.figure()
axes1 = figure.add_subplot(2,1,1)
axes1.plot([2,4,8],[4,7,5])
axes1.set_xticks([2,4,8])
axes1.set_xticklabels(["低","中","高"])
axes1.set_xlabel("年齡")
axes1.set_ylabel("數值大小")
axes1.set_title("波動值")
axes2 = figure.add_subplot(2,1,2)
axes2.plot([2,4,8],[7,2,6])
plt.subplots_adjust(hspace=0.5)
複制
結果如下:
5、添加注解
1)什麼是注解?
“注解”就是在圖形上繪制文本等說明資訊。
2)箭頭和文本一次性設定:plt.annotate()
① 常用參數介紹
- xy 箭頭指向坐标
- xytext:文本起點坐标。(箭頭尾部坐标)
- arrowprops:字典類型,可設定箭頭的屬性。
- facecolor:箭頭的顔色。
- headwidth:箭頭的寬度。
- width:箭身的寬度。
- headlength:箭頭的長度。
- shrink:收縮大小。
常見參數用法如圖:
② 舉例如下
x = np.linspace(-10, 10, 100)
plt.plot(x, -x ** 2, “r-”)
plt.title(“抛物線圖”)
plt.annotate(“這是極大值點”, xy=(0,0), xytext=(-5,-40),
arrowprops=dict(facecolor=“g”,width=1,headwidth=5))
複制
3)箭頭和文本分開設定
- plt.text文法格式如下:
- plt.text(x,y,文本值)
- plt.arrow文法格式
- plt.arrow(x,y,dx,dy,width=,head_width=,head_length)
① 常用參數如下
### plt.text添加普通文本
plt.text:顯示文本(基于坐标)
plt.figtext:顯示文本(基于圖檔)
* x,y:文本點的坐标。
* 文本值:給這個點添加文本注釋。
### plt.arrow添加箭頭
* x,y:箭頭的起點坐标。
* dx,dy:基于起點坐标的偏移量。
* width:箭頭尾部的寬度。
* head_width:箭頭的寬度。
* head_length:箭頭的長度。
* alpha:表示箭頭的透明度。範圍是0-1。
複制
關于dx、dy的用法示範:
② 舉例如下:
x = np.linspace(-10, 10, 100)
plt.plot(x, -x ** 2, "r-")
plt.title("抛物線圖")
plt.text(-3.5, -50, "這是極值點")
plt.arrow(-2.5,-45,2.5,42,width=0.001,head_width=1,head_length=2,color="b")
複制
結果如下:
4)給圖形上的坐标點添加資料标簽
① 例一
x = np.linspace(0,10,100)
y = -x**2
plt.xlim(0,100)
plt.ylim(0,100)
plt.title("抛物線")
plt.plot(x,y)
for xy in zip(x,y):
plt.annotate("(%s,%s)" % xy, xy=xy)
複制
結果如下:
② 例二
x = np.arange(1,13)
y = np.array([1234,871,2222,3123,5612,2222,4123,3214,999,6000,5423,3123])
plt.plot(x,y,"ro-",label="每月工資")
plt.title("張三1-12月工資")
plt.xlabel("月份")
plt.ylabel("工資")
plt.legend(loc="best")
for xy in zip(x,y):
plt.annotate("{}".format(xy[1]),xy=xy,ha="center",va="bottom")
plt.savefig("張三工資",dpi=300,facecolor="g")
複制
結果如下:
③ 例三“添加注釋的第2種方式
x = np.arange(1,13)
y = np.array([1234,871,2222,3123,5612,2222,4123,3214,999,6000,5423,3123])
plt.plot(x,y,"ro-",label="每月工資")
plt.title("張三1-12月工資")
plt.xlabel("月份")
plt.ylabel("工資")
plt.legend(loc="best")
for x,y in zip(x,y):
plt.text(x,y,y,ha="center",va="bottom",fontsize=10)
複制
結果如下:
matplotlib繪圖技巧詳解部分到此結束,
後續更新matplotlib相關圖形繪制~