使用 LaTeX 进行文本渲染#

Matplotlib 可以使用 LaTeX 来渲染文本。这可以通过在您的 rcParams 中设置 text.usetex : True 来激活,或者通过将 usetex 属性设置为 True 来激活单个 Text 对象。通过 LaTeX 处理文本比 Matplotlib 非常强大的 mathtext 速度更慢,但更灵活,因为可以使用不同的 LaTeX 包(字体包、数学包等)。结果可能很惊人,尤其是在您注意在图形中使用与主文档相同的字体时。

Matplotlib 的 LaTeX 支持需要一个可用的 LaTeX 安装。对于 *Agg 后端,还需要 dvipng;对于 PS 后端,还需要 PSfragdvipsGhostscript。对于 PDF 和 SVG 后端,如果存在 LuaTeX,它将用于加速一些后处理步骤,但请注意,它不用于解析 TeX 字符串本身(只支持 LaTeX)。这些外部依赖项的可执行文件必须全部位于您的 PATH 中。

只支持少数字体系列(由 PSNFSS 方案定义)。它们列在这里,以及相应的 LaTeX 字体选择命令和 LaTeX 包,这些包将自动使用。

通用系列

字体

serif (\rmfamily)

Computer Modern Roman, Palatino (mathpazo), Times (mathptmx), Bookman (bookman), New Century Schoolbook (newcent), Charter (charter)

无衬线字体 (\sffamily)

Computer Modern Serif, Helvetica (helvet), Avant Garde (avant)

手写体 (\rmfamily)

Zapf Chancery (chancery)

等宽字体 (\ttfamily)

Computer Modern Typewriter, Courier (courier)

默认字体族(不需要加载任何 LaTeX 包)是 Computer Modern。所有其他字体族都是 Adobe 字体。Times 和 Palatino 都有各自配套的数学字体,而其他 Adobe 衬线字体则使用 Computer Modern 数学字体。

要启用 LaTeX 并选择字体,请使用例如:

plt.rcParams.update({
    "text.usetex": True,
    "font.family": "Helvetica"
})

或者等效地,将您的 matplotlibrc 设置为

text.usetex : true
font.family : Helvetica

也可以将 font.family 设置为通用字体族名称之一,然后配置相应的通用字体族;例如:

plt.rcParams.update({
    "text.usetex": True,
    "font.family": "sans-serif",
    "font.sans-serif": "Helvetica",
})

(这是在 Matplotlib 3.5 之前所需的方案)。

以下是一个标准示例,使用 TeX 渲染数学方程

../../../_images/sphx_glr_tex_demo_001.png

请注意,显示数学模式 ($$ e=mc^2 $$) 不受支持,但添加命令 \displaystyle(如上面的演示所示)将产生相同的结果。

非 ASCII 字符(例如上面 y 轴标签中的度数符号)在 inputenc 支持的范围内得到支持。

注意

为了与非 usetex 情况保持一致,Matplotlib 对换行符进行了特殊处理,因此单个换行符会产生换行符(而不是像标准 LaTeX 中那样被解释为空格)。

Matplotlib 使用 underscore 包,以便下划线 (_) 在文本模式下“按原样”打印(而不是像标准 LaTeX 中那样导致错误)。下划线在数学模式下仍然会引入下标。

注意

某些字符在 TeX 中需要特殊转义,例如

# $ % & ~ ^ \ { } \( \) \[ \]

因此,这些字符的行为将根据 rcParams["text.usetex"](默认值:False)而有所不同。如上所述,下划线 (_) 在数学模式之外不需要转义。

PostScript 选项#

为了生成可以嵌入到新 LaTeX 文档中的封装 PostScript (EPS) 文件,Matplotlib 的默认行为是将输出进行蒸馏,这会移除 LaTeX 使用但在 EPS 文件中是非法的某些 PostScript 运算符。此步骤可能会产生一些用户无法接受的结果,因为文本被粗略地栅格化并转换为位图,而位图不像标准 PostScript 那样可缩放,并且文本不可搜索。一种解决方法是在您的 rc 设置中将 rcParams["ps.distiller.res"](默认值:6000)设置为更高的值(例如 6000),这将生成更大的文件,但可能看起来更好并且可以合理地缩放。另一种解决方法需要 PopplerXpdf,可以通过将 rcParams["ps.usedistiller"](默认值:None)更改为 xpdf 来激活。这种替代方法会生成不栅格化文本的 PostScript,因此它可以正确缩放,可以在 Adobe Illustrator 中编辑,并且可以在 pdf 文档中搜索文本。

可能的问题#

  • 在 Windows 上,可能需要修改 PATH 环境变量以包含包含 latex、dvipng 和 ghostscript 可执行文件的目录。有关详细信息,请参阅 环境变量在 Windows 中设置环境变量

  • 使用 MiKTeX 和 Computer Modern 字体,如果您遇到奇怪的 *Agg 和 PNG 结果,请转到 MiKTeX/Options 并更新您的格式文件。

  • 在 Ubuntu 和 Gentoo 上,基本的 texlive 安装不包含 type1cm 包。您可能需要安装一些额外的包才能获得与其他 LaTeX 发行版捆绑在一起的所有好东西。

  • Matplotlib 已经取得了一些进展,可以直接使用 dvi 文件进行文本布局。这允许 LaTeX 用于 pdf 和 svg 后端以及 *Agg 和 PS 后端的文本布局。将来,LaTeX 安装可能是唯一的外部依赖项。

故障排除#

  • 尝试删除您的 .matplotlib/tex.cache 目录。如果您不知道在哪里找到 .matplotlib,请参阅 matplotlib 配置和缓存目录位置

  • 确保 LaTeX、dvipng 和 ghostscript 都正常工作并且在您的 PATH 中。

  • 确保您尝试的操作在 LaTeX 文档中是可行的,您的 LaTeX 语法有效,并且在必要时使用原始字符串以避免意外的转义序列。

  • rcParams["text.latex.preamble"](默认值:'')不受官方支持。此选项提供了很大的灵活性,以及很多造成问题的方法。请在向邮件列表报告问题之前禁用此选项。

  • 如果您仍然需要帮助,请参阅 获取帮助

由 Sphinx-Gallery 生成的画廊