天天看點

matplotlib繪圖技巧詳解(三)

↑ 關注 + 星标 ~ 有趣的不像個技術号

每晚九點,我們準時相約

matplotlib繪圖技巧詳解(三)
matplotlib繪圖技巧詳解(三)

大家好,我是黃同學

我們之前已經講述了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])
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

① 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])
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

③ 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)
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

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)
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

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))
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

① 不使用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])
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

② 使用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])
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

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")
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

② 在顯示建立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")
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

3)若隐式建立畫布,怎麼設定figure畫布大小呢?

① 示範如下

figure = plt.gcf()
figure.set_size_inches(6,5)
plt.plot([1,3,5,7],[4,9,6,8],"g-o")
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

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())
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

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)
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

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], ["偏低", "中等", "偏高"])
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

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()
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

② 設定x與y軸的刻度範圍

plt.plot([2, 4, 8], [4, 7, 5], "b-o")
plt.axis((2,8,4,7))
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

③ 去掉坐标軸:plt.axis(“off”)

plt.plot([2, 4, 8], [4, 7, 5], “b-o”)
plt.axis(“off”)
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

④ 設定x軸和y軸每個機關長度大小一緻:plt.axis(“equal”)

plt.plot([2, 4, 8], [4, 7, 5], "b-o")
plt.axis("off")
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

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("圖示題")
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

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)
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

5、添加注解

1)什麼是注解?

“注解”就是在圖形上繪制文本等說明資訊。

2)箭頭和文本一次性設定:plt.annotate()

① 常用參數介紹

  • xy 箭頭指向坐标
  • xytext:文本起點坐标。(箭頭尾部坐标)
  • arrowprops:字典類型,可設定箭頭的屬性。
  • facecolor:箭頭的顔色。
  • headwidth:箭頭的寬度。
  • width:箭身的寬度。
  • headlength:箭頭的長度。
  • shrink:收縮大小。

常見參數用法如圖:

matplotlib繪圖技巧詳解(三)

② 舉例如下

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))
           

複制

matplotlib繪圖技巧詳解(三)

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的用法示範:

matplotlib繪圖技巧詳解(三)

② 舉例如下:

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")
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

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)
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

② 例二

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")
           

複制

結果如下:

matplotlib繪圖技巧詳解(三)

③ 例三“添加注釋的第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繪圖技巧詳解部分到此結束,

後續更新matplotlib相關圖形繪制~

matplotlib繪圖技巧詳解(三)