HOWTO · Matplotlib

Matplotlib 中使用 Latex 公式

本教程解释了我们如何在 Matplotlib 中呈现 LaTex 公式或方程。

本页内容

Matplotlib 可在标题、坐标轴标签、图例和注释中排版数学表达式。其内置 mathtext 无需单独安装 TeX,即可处理许多常见公式。若要使用更广泛的 LaTeX 文档排版功能,可通过 text.usetex 启用外部渲染器;此选项需要额外的系统依赖。除非另有说明,以下示例均使用 mathtext。

在 Matplotlib 中渲染数学文本

将数学表达式放在美元符号之间,并使用以 r 为前缀的 Python 原始字符串,让反斜杠原样传递给数学解析器。这对 \sin 和希腊字母等命令很有用。普通文本也可以与数学表达式一起放在同一个标签中。mathtext 默认启用,支持分数、下标、上标和许多常见符号;但它并未完整实现 LaTeX 的所有宏包或命令。

运行以下示例,绘制一条正弦曲线,并在 y 轴标签和图例中显示公式。代码块中的图标题及坐标轴文字保留英文,数学公式仍会按示例所示渲染:

本节中的代码以及显示的标签或输出仍为英文。

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

一条从 0 到 2π 的正弦曲线,y 轴标签和图例中都显示了 mathtext 公式 sin(x)。

这条正弦曲线使用 Matplotlib 内置的 mathtext;上方代码中的绘图数据和公式标签均可选中。

数据覆盖一个完整周期,从 0 到 2π;np.sin(x) 用于计算 y 值。原始字符串会保留 \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 用作横轴标签。代码块中的图标题、坐标轴文字和数值标签保留英文:

本节中的代码以及显示的标签或输出仍为英文。

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 显示三个幂次;上方代码和曲线数值均可选中。

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 都用于渲染图中文字;它们不会更改底层数值数据。描述和单位尽量使用普通文本,只在符号表达式中使用数学定界符,并让图例中的公式简洁易读。如果绘图必须与出版物的排版完全一致,请使用最终文档所用的字体、渲染器和输出格式进行核对。