pgf通过后端使用 XeLaTeX/LuaLaTeX 进行文本渲染#

使用pgf后端,Matplotlib 可以将图形导出为可以用 pdflatex、xelatex 或 lualatex 处理的 pgf 绘图命令。XeLaTeX 和 LuaLaTeX 具有完整的 Unicode 支持,可以使用操作系统中安装的任何字体,利用 OpenType、AAT 和 Graphite 的高级排版功能。创建的 Pgf 图片plt.savefig('figure.pgf') 可以作为原始命令嵌入到 LaTeX 文档中。图形也可以plt.savefig('figure.pdf')通过切换后端直接编译保存为PDF

matplotlib.use('pgf')

或通过明确请求使用pgf后端

plt.savefig('figure.pdf', backend='pgf')

或通过注册它来处理 pdf 输出

from matplotlib.backends.backend_pgf import FigureCanvasPgf
matplotlib.backend_bases.register_backend('pdf', FigureCanvasPgf)

最后一种方法允许您继续使用常规交互式后端并从图形用户界面保存 xelatex、lualatex 或 pdflatex 编译的 PDF 文件。

Matplotlib 的 pgf 支持需要最近的LaTeX安装,包括 TikZ/PGF 包(例如TeXLive),最好安装 XeLaTeX 或 LuaLaTeX。如果您的系统上存在 pdftocairo 或 ghostscript,数字也可以选择保存为 PNG 图像。所有应用程序的可执行文件必须位于您的PATH.

rcParams控制 pgf 后端的行为:

范围

文档

pgf.preamble

包含在 LaTeX 序言中的行

pgf.rcfonts

使用 fontspec 包从 rc 参数设置字体

pgf.tex系统

“xelatex”(默认)、“lualatex”或“pdflatex”

笔记

TeX 定义了一组特殊字符,例如:

# $ % & ~ _ ^ \ { }

通常,这些字符必须正确转义。为方便起见,某些字符(_、^、%)会在数学环境之外自动转义。其他字符不会被转义,因为它们通常在实际的 TeX 表达式中需要。但是,可以通过自定义前导配置 TeX 以将它们视为“普通”字符(在 TeX 中称为“catcode 12”),例如:

plt.rcParams["pgf.preamble"] = (
    r"\AtBeginDocument{\catcode`\&=12\catcode`\#=12}")

多页 PDF 文件#

pgf 后端还支持使用多页 pdf 文件 PdfPages

from matplotlib.backends.backend_pgf import PdfPages
import matplotlib.pyplot as plt

with PdfPages('multipage.pdf', metadata={'author': 'Me'}) as pdf:

    fig1, ax1 = plt.subplots()
    ax1.plot([1, 5, 3])
    pdf.savefig(fig1)

    fig2, ax2 = plt.subplots()
    ax2.plot([1, 5, 3])
    pdf.savefig(fig2)

字体规范#

用于获取文本元素大小或将图形编译为 PDF 时使用的字体通常在rcParams. 您还可以通过清除rcParams["font.serif"](default: )、 (default: ) 或(default: ) 的列表来使用 LaTeX 默认 Computer Modern 字体。请注意,这些字体的字形覆盖范围非常有限。如果您想保留 Computer Modern 字体但需要扩展 Unicode 支持,请考虑安装 Computer Modern Unicode字体CMU SerifCMU Sans Serif等。['DejaVu Serif', 'Bitstream Vera Serif', 'Computer Modern Roman', 'New Century Schoolbook', 'Century Schoolbook L', 'Utopia', 'ITC Bookman', 'Bookman', 'Nimbus Roman No9 L', 'Times New Roman', 'Times', 'Palatino', 'Charter', 'serif']rcParams["font.sans-serif"]['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif']rcParams["font.monospace"]['DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Computer Modern Typewriter', 'Andale Mono', 'Nimbus Mono L', 'Courier New', 'Courier', 'Fixed', 'Terminal', 'monospace']

保存到 时.pgf,用于图形布局的字体配置 Matplotlib 包含在文本文件的标题中。

"""
=========
PGF fonts
=========
"""

import matplotlib.pyplot as plt
plt.rcParams.update({
    "font.family": "serif",
    # Use LaTeX default serif font.
    "font.serif": [],
    # Use specific cursive fonts.
    "font.cursive": ["Comic Neue", "Comic Sans MS"],
})

fig, ax = plt.subplots(figsize=(4.5, 2.5))

ax.plot(range(5))

ax.text(0.5, 3., "serif")
ax.text(0.5, 2., "monospace", family="monospace")
ax.text(2.5, 2., "sans-serif", family="DejaVu Sans")  # Use specific sans font.
ax.text(2.5, 1., "comic", family="cursive")
ax.set_xlabel("µ is not $\\mu$")

fig.tight_layout(pad=.5)

自定义序言#

通过将您自己的命令添加到序言中,可以进行完全自定义。使用rcParams["pgf.preamble"](默认值:)''如果你想配置数学字体,unicode-math例如使用,或者加载额外的包。此外,如果您想自己进行字体配置而不是使用 rc 参数中指定的字体,请确保禁用rcParams["pgf.rcfonts"](默认值:) True

"""
============
PGF preamble
============
"""

import matplotlib as mpl
mpl.use("pgf")
import matplotlib.pyplot as plt
plt.rcParams.update({
    "font.family": "serif",  # use serif/main font for text elements
    "text.usetex": True,     # use inline math for ticks
    "pgf.rcfonts": False,    # don't setup fonts from rc parameters
    "pgf.preamble": "\n".join([
         r"\usepackage{url}",            # load additional packages
         r"\usepackage{unicode-math}",   # unicode math setup
         r"\setmainfont{DejaVu Serif}",  # serif font via preamble
    ])
})

fig, ax = plt.subplots(figsize=(4.5, 2.5))

ax.plot(range(5))

ax.set_xlabel("unicode text: я, ψ, €, ü")
ax.set_ylabel(r"\url{https://matplotlib.org}")
ax.legend(["unicode math: $λ=∑_i^∞ μ_i^2$"])

fig.tight_layout(pad=.5)

选择 TeX 系统#

Matplotlib 使用的 TeX 系统由rcParams["pgf.texsystem"](默认:)选择'xelatex'。可能的值为'xelatex'(默认)'lualatex''pdflatex'。请注意,在选择 pdflatex 时,必须在序言中配置字体和 Unicode 处理。

"""
=============
PGF texsystem
=============
"""

import matplotlib.pyplot as plt
plt.rcParams.update({
    "pgf.texsystem": "pdflatex",
    "pgf.preamble": "\n".join([
         r"\usepackage[utf8x]{inputenc}",
         r"\usepackage[T1]{fontenc}",
         r"\usepackage{cmbright}",
    ]),
})

fig, ax = plt.subplots(figsize=(4.5, 2.5))

ax.plot(range(5))

ax.text(0.5, 3., "serif", family="serif")
ax.text(0.5, 2., "monospace", family="monospace")
ax.text(2.5, 2., "sans-serif", family="sans-serif")
ax.set_xlabel(r"µ is not $\mu$")

fig.tight_layout(pad=.5)

故障排除#

  • 请注意,在某些 Linux 发行版和 MiKTeX 安装中发现的 TeX 包已经过时了。确保更新您的包目录并升级或安装最近的 TeX 发行版。

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

  • 有时保存为 png 图像的图形中的字体渲染非常糟糕。当 pdftocairo 工具不可用并且 ghostscript 用于 pdf 到 png 的转换时,就会发生这种情况。

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

  • rcParams["pgf.preamble"](默认值'':)提供了很大的灵活性,以及​​很多导致问题的方法。遇到问题时,请尝试最小化或禁用自定义序言。

  • 配置unicode-math环境可能有点棘手。例如,TeXLive 发行版提供了一组数学字体,这些字体通常不会在系统范围内安装。XeTeX 与 LuaLatex 不同,无法通过它们的名称找到这些字体,这就是为什么您可能必须指定 \setmathfont{xits-math.otf}而不是使字体可用于您的操作系统的原因。有关更多详细信息,请参阅此 tex.stackexchange.com 问题\setmathfont{XITS Math}

  • 如果 Matplotlib 使用的字体配置与您的 LaTeX 文档中的字体设置不同,则导入图形中文本元素的对齐可能会关闭。.pgf如果您不确定 Matplotlib 用于布局的字体,请检查文件的标题。

  • .pgf如果图中有很多对象,矢量图像和文件可能会变得臃肿。这可能是图像处理或非常大的散点图的情况。.pdf在极端情况下,这可能导致 TeX 内存不足:“TeX 容量超出,抱歉” 您可以配置 Latex 以增加可用于生成图像 的内存量,如tex.stackexchange.com上所述。另一种方法是使用rasterized=True关键字或.set_rasterized(True)按照此示例“光栅化”导致问题的图形部分。

  • 只有在加载了相应的字体包时,才会编译和渲染各种数学字体。具体来说,\mathbf{}在希腊字母上使用时,默认的计算机现代字体可能不包含它们,在这种情况下,字母不会被渲染。在这种情况下,lmodern应该加载包。

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

由 Sphinx-Gallery 生成的画廊