1. 程式人生 > >Matplotlib面向物件的繪圖方式中不同Artist物件的介紹

Matplotlib面向物件的繪圖方式中不同Artist物件的介紹

Matplotlib是一個面向物件的繪相簿,在最終影象上所呈現出來的所有元素,都是一個可以控制的物件,那麼如何理解繪圖的過程呢?可以簡單地類比在畫布上畫圖的過程,
首先大致的繪製流程:

  1. 建立Figure物件(相當於在畫架上新增畫布)
  2. 為滅一個Figure物件新增一個或者多個Axes物件(在某張畫布上劃分不同的畫圖區域)
  3. 呼叫Axes物件的方法來建立各種簡單型別的Artist物件(在某一個畫圖區域新增各種具體的元素)

簡單來說,最大的Figure中可以包含多個Axes,在每個Axes中,又可以繪製各種基本的影象。
具體來看三種層次的主要物件:

Figure物件

Figure物件,或者說是容器,是最大一層次的物件,就相當於一張畫布,包含影象的所有元素,一個Figure物件最後的表現就是一張影象,例如:

fig1 = plt.figure(1)
fig2 = plt.figure(2)

plt.show()

執行之後,我們可以得到兩張空圖:

在Figure中也可以新增簡單的Artist物件,比如文字,線條等,例如新增兩條線:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.lines import Line2D

fig1 = plt.figure()
line1 = Line2D([1, 0], [1, 0], transform=fig1.transFigure, figure=fig1, color='r')
line2 = Line2D([1, 0], [0, 1], transform=fig1.transFigure, figure=fig1, color='g')

fig1.lines.extend([line1, line2])

plt.show()

效果如下:

一般情況下,我們不會在Figure中繪製這樣的影象,這樣一張圖只能繪製一組影象,所以就用到了Axes物件來新增子圖。

Axes物件

Axes,稱之為子圖,可以這樣理解,在繪製漫畫的時候,一張畫布上有很多格子,不同的格子內容可以獨立繪製,這裡的格子就是Axes物件。
在某張Figure中新增子圖的時候有兩種常用方式:

  • figure.add_axes()
  • figure.add_subplot()

簡單例子:

ax1 = fig1.add_subplot(221)
ax2 = fig1.add_subplot(224)

這裡的引數在我的另一篇筆記中記錄了,所以不再贅述,效果如下:

ax3 = fig2.add_axes([0.2, 0.2, 0.6, 0.4])
ax4 = fig2.add_axes([0.2, 0.7, 0.6, 0.2])

效果:

這裡的函式傳入四個引數,分別指定了左邊距,下邊距,寬度和高度,都是小於1 的數字,其實就相當於等比例劃分,大致估計一下寬度和高度就可以看出來。
其實這兩個方法建立的物件還是有點區別的,add_subplot() 函式建立的物件是SubplotAxes, 另一個則是Axes物件,SubplotAxes是Axes的派生類。
下面這個例子中說明一些dui子圖物件屬性的設定方法,對於所有的物件都可以使用這兩種方式:

import matplotlib.pyplot as plt
import numpy as np

fig1 = plt.figure()

# 可以設定多個屬性的值
ax1 = fig1.add_subplot(221)
ax1.set(facecolor='lightgreen', title='Axes 1')

# 分別設定每種屬性
ax2 = fig1.add_subplot(224)
ax2.set_facecolor('lightblue')
ax2.set_title('Axes 2')

plt.show()

效果:

有了每個格子,那麼最後一步就是每一個格子中的內容了。

曲線等簡單Artist物件

繪製好了格子,那麼新增的曲線,刻度等都是最後一層的內容了,例如,在不同Axes中繪製圖像,在上面的程式碼中新增:

x = np.linspace(-np.pi, np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

ax1.plot(x, y1)   # 在ax1子圖中繪製
ax2.plot(x, y2)  # 在 ax2子圖中繪製

同樣,每條曲線,或者每個座標軸都是一個物件,例如,獲取曲線物件,如對它的屬性進行設定,同樣設定的方式有兩種,分別是集中設定或者分散設定:

line1 = ax1.plot(x, y1)[0]   # 注意 獲取曲線物件的方式返回的是一個list,所以註明是第一個元素
line1.set_color('red')
line1.set_linewidth(5)

line2 = ax2.plot(x, y2)[0]
line2.set(color='blue', linewidth=2)

效果:

上面演示的Line物件,還有像Axis物件,控制的是座標軸,包括對刻度等等進行設定,原理是一樣的。
基本就這樣。

以上~