天天看點

Matplotlib在圖形中添加注釋前言添加标題為坐标軸添加标簽添加箭頭添加圖例使用LaTex風格的符号使用中文字元

前言

我們可以用 Matplotlib 繪制出複雜而又精美的統計圖,但是如果沒有注釋,我們很難讓其他人明白圖中的點、線究竟代表着什麼,有什麼樣的含義,也就失去了統計圖的意義,為了解決這一問題,Matplotlib 提供了大量對圖形進行注釋的方法,這些注釋方法對于所有的繪圖函數(如 plt.plot()、plt.scatter()、plt.histogram() 等)都是通用的,利用這些注釋可以使統計圖變得通俗易懂。

添加标題

從最簡單的添加标題開始:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-4, 4, 10005)
y = 5 * (x + 4.2) * (x + 4.) * (x - 2.5)
plt.title('A polynomial')
plt.plot(x, y, c = 'm')
plt.show()      
Matplotlib在圖形中添加注釋前言添加标題為坐标軸添加标簽添加箭頭添加圖例使用LaTex風格的符号使用中文字元

Tips:plt.title()函數接受一個字元串作為參數并将其作為整個圖形的标題。

為坐标軸添加标簽

在實際應用中,對統計圖坐标軸的适當描述有助于使用者了解圖形所表達的含義。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8, 1000)
y = 2.0 * x + 0.5 * 5 * x ** 2
plt.title('Acceleration Moving')
plt.xlabel('Time')
plt.ylabel('distance')
plt.plot(x, y, c = 'c')
plt.show()      
Matplotlib在圖形中添加注釋前言添加标題為坐标軸添加标簽添加箭頭添加圖例使用LaTex風格的符号使用中文字元

Tips:使用plt.xlabel()和plt.ylabel()函數分别為水準軸和垂直軸添加注釋。

添加箭頭

添加文本框當然可以幫助注釋圖形,但有時當說明文本過多,并不能清楚的說明究竟與圖形的那一部分相對應,是以要說明圖形中的特定部分,沒有什麼比使用箭頭更好的了, Matplotlib 使用 plt.annotate() 函數繪制箭頭。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8, 1000)
y = 2.0 * x + 0.5 * 5 * x ** 2
plt.annotate('start',
        ha = 'center', va = 'bottom',
        xytext = (2, 30.),
        xy = (0, 0),
        arrowprops = { 'facecolor' : 'black', 'shrink' : 0.05 })
plt.title('Acceleration Moving')
plt.plot(x, y, c = 'c')
plt.show()      
Matplotlib在圖形中添加注釋前言添加标題為坐标軸添加标簽添加箭頭添加圖例使用LaTex風格的符号使用中文字元

Tips:plt.annotate()函數在顯示與 plt.text() 作用相同的說明文本文本外,同時也會渲染箭頭。要顯示的說明文本是第一個參數;xy 參數指定箭頭的目标;xytext 參數指定文本位置,同樣可以通過 ha 和 va 參數來改變文本對齊方式。

箭頭的樣式由傳遞給 arrowprops 參數的字典控制,其中常用的鍵值包括:

說明與可選值
arrowstyle 控制箭頭的樣式,可選值包括 "<-"、"<"、"wedge"、"simple" 和 "fancy" 等
facecolor 用于設定箭頭背景和邊的顔色
edgecolor 用于設定箭頭邊的顔色
alpha 用于設定透明度級别,使箭頭與背景更好的混合

收縮參數控制箭頭端點和箭頭本身之間的間隙。

添加圖例

在複雜圖形中,往往包含大量不同的曲線和點,如果這些曲線和點沒有相應的圖例,将無法對其進行準确的區分,是以圖例在實踐中是必不可少的。

使用 plt.legend() 函數以及繪圖函數的 label 可選參數,可以添加圖例:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 6, 1024)
data = np.random.standard_normal((150, 2))
print(data.size)
y_1 = np.sin(x)
y_2 = np.cos(x)
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y_1, c = 'm', lw = 3., label = 'sin(x)')
plt.plot(x, y_2, c = 'c', lw = 3., ls = '--', label = 'cos(x)')
plt.scatter(data[:,0],data[:,1],c='y', label = 'random')
plt.legend()
plt.show()      
Matplotlib在圖形中添加注釋前言添加标題為坐标軸添加标簽添加箭頭添加圖例使用LaTex風格的符号使用中文字元

Tips:每個plt繪圖函數(如 plt.plot()、plt.scatter() 等)都有一個可選的 label 參數來命名圖形的元素。plt.legend() 函數的作用是呈現圖例,圖例是根據标簽自動生成的。

plt.legend() 函數包含可選參數來控制圖例的呈現:

參數
loc 用于控制圖例的位置,預設值為 "best",将以适合的方式自動放置圖例,其他可選值包括 "upper left"、"lower left"、"lower right"、"right"、"center left"、"center right"、"lower center"、"upper center" 和 "center"
shadow 可選值包括True和False,用于設定是否使用陰影效果呈現圖例
fancybox 可選值包括True和False,用于是否使用圓角框呈現圖例
title 用于為圖例設定标題
ncol 強制設定圖例的列數

使用LaTex風格的符号

我們已經學習了為圖形添加多種注釋的方法。然而,在實踐中,我們通常需要使用數學符号,是以,我們需要使用 LaTex 文法來添加數字元号。

要使用 LaTex 風格的符号,首先需要在計算機上安裝可用的 LaTeX 配置,以便 Matplotlib 可以解釋 LaTeX 文法來呈現數學文本。有關于安裝LaTeX的方法,不在本文的主題範圍内,大家可以根據自己的作業系統檢索安裝方法.

LaTex簡介

LaTex 是學術界廣泛使用的一種文獻排版系統。與 Microsoft Word 等文檔編輯器不同,LaTeX 使用者在編輯文檔時無法看到其最終顯示效果。文檔被描述為純文字文檔中存儲的文本及指令。最終,LaTeX 将解釋文檔以進行呈現。在科學和工程界,LaTeX 的公式語言通常用于在電子郵件和論壇中編寫數學文本。

使用LaTex符号示例

使用 LaTex 風格的符号時,函數接受的字元串參數值以“$”字元開頭和結尾,這是向 Matplotlib 發出信号,以将文本解釋并呈現為 LaTeX 樣式的數學文本。字元串的内容就是數學文本的标準語言,關于 Matplotlib 中 LaTeX 樣式的數學文本的介紹,可以參考

Matplotlib官網

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-4, 4, 10005)
y = 3 / 5 * (x + 4.2) * (x + 4.) * (x - 2.5)
plt.title('$f(x)=\\frac{3}{5}(x+4.4)(x+4)(x-2.5)$')
plt.plot(x, y, c = 'k')
plt.show()      
Matplotlib在圖形中添加注釋前言添加标題為坐标軸添加标簽添加箭頭添加圖例使用LaTex風格的符号使用中文字元

Tips:這種 LaTex 風格的符号不限于标題,它可以用于任何其它注釋。LaTeX 語言在很大程度上依賴于轉義字元 \,但此符号恰好也是 Python 的字元串轉義字元。是以,如果要在一個 LaTeX 文本中使用 \ 作為轉移字元,需要在 Python 字元串中使用兩個 \。為了避免漏掉轉義字元,可以在字元串前面加上 r,這樣就不需要任何轉義字元了,即:"$f(x)=\\frac{1}{4}(x+4)(x+1)(x-2)$" 等價于 r'$f(x)=\frac{1}{4}(x+4)(x+1)(x-2)$'。

使用中文字元

中文是使用 Matplotlib 的一個痛點,但是在實際應用中,又不可避免的會使用到中文用于統計圖注釋的顯示,如果不進行配置,會将中文字元顯示為亂碼。

使用中文字元作為注釋有多種方式,這裡本着簡單就是最優的理念,使用 plt.rcParams['font.sans-serif'] 進行設定:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 6, 1024)
data = np.random.standard_normal((150, 2))
y_1 = np.sin(x)
y_2 = np.cos(x)
plt.xlabel('x軸')
plt.ylabel('y軸')
plt.title('中文字元使用示例')
plt.plot(x, y_1, c = 'm', lw = 3., label = '正弦函數')
plt.plot(x, y_2, c = 'c', lw = 3., ls = '--', label = '餘弦函數')
plt.scatter(data[:,0],data[:,1],c='y', label = '随機點')
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.legend()
plt.show()      
Matplotlib在圖形中添加注釋前言添加标題為坐标軸添加标簽添加箭頭添加圖例使用LaTex風格的符号使用中文字元

Tips:使用 plt.rcParams['font.sans-serif'] 設定支援中文字元的字型,使用中文字元的用法範圍與 LaTex 風格的符号一樣,它可以用于所有注釋,另外需要確定系統支援所設定的中文字元字型。