HOWTO · Matplotlib
Matplotlib 中使用 Latex 公式
本教程解釋了我們如何在 Matplotlib 中呈現 LaTex 公式或方程。
本頁內容
Matplotlib 可在標題、座標軸標籤、圖例與註解中排版數學式。內建的 mathtext 不需另行安裝 TeX,就能處理許多常見公式。若要以更完整的 LaTeX 文件方式排版,可使用 text.usetex 啟用外部渲染器;此選項需要額外的系統相依項目。除非另有說明,以下範例都使用 mathtext。
在 Matplotlib 中呈現數學文字
將數學式放在美元符號之間,並使用前綴為 r 的 Python 原始字串,讓反斜線能原樣傳給數學解析器。這適用於 \sin 和希臘字母等指令。也可以在同一個標籤中,讓一般文字與數學式並列。mathtext 預設為啟用,能處理分數、下標、上標和許多符號等常見記法;但它並未完整實作所有 LaTeX 套件或指令。
執行以下範例,以公式作為 y 軸標籤和圖例,繪製正弦曲線。程式碼區塊維持原樣,其中的圖表標題「Sine curve with mathtext」因此保留英文:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y, label=r"$\sin(x)$")
ax.set_xlabel("x")
ax.set_ylabel(r"$\sin(x)$")
ax.set_title("Sine curve with mathtext")
ax.legend()
fig.tight_layout()
plt.show()
正弦曲線使用 Matplotlib 內建的 mathtext;上方程式碼中的繪圖資料與公式標籤仍可選取。圖表標題「Sine curve with mathtext」保留英文,因為程式碼區塊必須維持原樣。
資料涵蓋一個完整週期,範圍從 0 到 2π,y 值由 np.sin(x) 計算。原始字串會保留 \sin 中的反斜線。美元符號用來標示標籤中的數學部分;若省略,Matplotlib 會將內容視為一般字元。若公式無法呈現,請確認分隔符號成對,且每個指令都受 mathtext 支援。
啟用外部 LaTeX 渲染
若需要 mathtext 未提供的 LaTeX 功能,或希望圖表文字符合文件的 TeX 字體風格,可選擇外部渲染。在建立圖形前設定 text.usetex。例如,plt.rcParams["text.usetex"] = True 會對之後建立的圖形啟用此功能;若要改回使用 mathtext,請將值設為 False。也可以在繪圖程式碼周圍使用作用範圍限定方式:plt.rc_context({"text.usetex": True})。
外部渲染需要相容的 LaTeX 安裝,以及 Matplotlib 所需的輔助程式,包括 dvipng,以及視平台和輸出方式而定的 Ghostscript。請安裝適用於作業系統的相容套件,並確保能透過 PATH 找到其可執行檔。套件名稱和需求會因平台及 Matplotlib 設定而異;若渲染失敗,請查看錯誤訊息,以及所安裝 Matplotlib 版本的文件。缺少可執行檔、不支援的套件或指令,或 TeX 編譯錯誤,都可能導致圖中文字無法呈現。若只需顯示常見方程式,無須啟用此選項,因為 mathtext 不需這些外部相依項目。
如需官方的相依項目與設定說明,請參閱 Matplotlib 的使用 LaTeX 格式化文字文件。請留意平台和輸出方式的差異,因為所需的輔助程式會隨環境而變。
此設定會改變 Matplotlib 呈現文字的方式,不會改變 Python 字串本身。數學式請使用含美元符號分隔符的原始字串,並在實際產生最終圖形的環境中測試代表性的標籤。本文不假定特定版本的 LaTeX 或 Ghostscript。
使用希臘字母與其他符號
mathtext 能辨識美元符號分隔符內的希臘字母指令與上標語法。例如,r"$\alpha^2$" 會顯示 alpha 的平方。標籤和圖例項目也可以使用相同寫法;若周圍文字不是數學記法,請將說明文字留在分隔符之外。
以下範例比較 α、α² 和 α³,並以 alpha 作為水平軸標籤。程式碼區塊維持原樣,因此其中的圖表標題「Greek letters and superscripts」保留英文:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import numpy as np
import matplotlib.pyplot as plt
alpha = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(alpha, alpha, label=r"$\alpha$")
ax.plot(alpha, alpha ** 2, label=r"$\alpha^2$")
ax.plot(alpha, alpha ** 3, label=r"$\alpha^3$")
ax.set_xlabel(r"$\alpha$")
ax.set_ylabel("Value")
ax.set_title("Greek letters and superscripts")
ax.legend()
fig.tight_layout()
plt.show()
圖例以 mathtext 顯示三個次方;上方程式碼和曲線數值均可選取。圖表標題「Greek letters and superscripts」保留英文,因為程式碼區塊必須維持原樣。
Matplotlib 的 mathtext 支援許多常見符號,但其指令集與完整的 LaTeX 安裝不同。若指令不受支援,請改用 mathtext 支援的簡單寫法;若所需記法依賴 LaTeX 功能,則可改用外部渲染。每個完整公式都應放在一對美元符號內,讓解析器能區分數學式與一般標籤文字。
自訂數學文字並新增註解
可在 ax.set_title、ax.set_xlabel 或 ax.set_ylabel 等呼叫中使用 fontsize=14 之類的引數,調整個別項目的文字大小。若要統一整張圖的樣式,可透過 plt.rcParams 設定 Matplotlib 的 font.size、axes.titlesize 和 axes.labelsize;例如,plt.rcParams["font.size"] = 12 會變更基礎文字大小。也可以透過 plt.rcParams["font.family"] = "serif" 指定襯線字型。可用字型取決於執行所在的電腦,外部 LaTeX 渲染也有自己的字型設定,因此請在圖形的最終尺寸下檢查呈現效果。
使用 ax.annotate 可在資料座標上放置註記,也可以選擇畫箭頭指向該點。以正弦曲線的波峰為例,其資料位置約為 (np.pi / 2, 1)。將該位置指定給 xy,另選一個 xytext 位置放置註記,再用 arrowprops={"arrowstyle": "->"} 加上箭頭。註記文字可以混合一般文字與數學式,例如 r"Peak: $\sin(x)=1$"。如此一來,標籤既容易閱讀,也能指出正在說明的圖形特徵。
mathtext 和外部 LaTeX 都只負責呈現圖中文字,不會改變底層數值資料。描述與單位盡可能使用一般文字,將數學分隔符保留給公式,並讓圖例中的公式簡潔易讀。若圖表必須精確符合出版品的字體風格,請使用最終文件採用的相同字型、渲染器和輸出格式進行確認。