Xeletex/Luamatex排版

如何使用 pgf Matplotlib中的后端。

使用 pgf 在后端,Matplotlib可以将图形导出为pgf绘图命令,这些命令可以用pdflatex、xelatex或lualatex进行处理。Xeletex和LuaLaTeX完全支持Unicode,可以使用操作系统中安装的任何字体,利用OpenType、AAT和Graphite的高级排版功能。Pgf图片创建人 plt.savefig('figure.pgf') 可以作为原始命令嵌入到 Latex 文档中。图形也可以直接编译并保存到PDF中。 plt.savefig('figure.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) ,最好安装Xeletex或LuaLaTex。如果系统中存在pdfocairo或ghostscript,图形也可以选择保存到PNG图像中。所有应用程序的可执行文件必须位于 PATH .

rcParams 控制pgf后端行为的:

参数 文档
pgf.preamble Latex 前言中包含的线路
pgf.rcfonts 使用fontspec包从rc params设置字体
pgf.texsystem “xelatex”(默认)、“lualatex”或“pdflatex”

注解

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

# $ % & ~ _ ^ \ { }

通常,这些字符必须正确转义。为了方便起见,有些字符 (_, ^,%)在数学环境之外自动转义。

多页PDF文件

PGF后端还支持使用 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. You can also use the LaTeX default Computer Modern fonts by clearing the lists for rcParams["font.serif"] (default: ['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"] (default: ['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif']) or rcParams["font.monospace"] (default: ['DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Computer Modern Typewriter', 'Andale Mono', 'Nimbus Mono L', 'Courier New', 'Courier', 'Fixed', 'Terminal', 'monospace']). Please note that the glyph coverage of these fonts is very limited. If you want to keep the Computer Modern font face but require extended Unicode support, consider installing the `Computer Modern Unicode`_ _字体 CMU serif无衬线 等。

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

"""
=========
Pgf Fonts
=========

"""

import matplotlib.pyplot as plt
plt.rcParams.update({
    "font.family": "serif",
    "font.serif": [],                    # use latex default serif font
    "font.sans-serif": ["DejaVu Sans"],  # use a specific sans-serif font
})

plt.figure(figsize=(4.5, 2.5))
plt.plot(range(5))
plt.text(0.5, 3., "serif")
plt.text(0.5, 2., "monospace", family="monospace")
plt.text(2.5, 2., "sans-serif", family="sans-serif")
plt.text(2.5, 1., "comic sans", family="Comic Sans MS")
plt.xlabel("µ is not $\\mu$")
plt.tight_layout(.5)

自定义前导

通过在序言中添加您自己的命令,完全定制是可能的。使用 rcParams["pgf.preamble"] (default: '') 如果要配置数学字体,请使用 unicode-math 例如,或用于加载其他包。另外,如果要自己进行字体配置,而不是使用rc参数中指定的字体,请确保禁用 rcParams["pgf.rcfonts"] (default: 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([
         "\\usepackage{units}",          # load additional packages
         "\\usepackage{metalogo}",
         "\\usepackage{unicode-math}",   # unicode math setup
         r"\setmathfont{xits-math.otf}",
         r"\setmainfont{DejaVu Serif}",  # serif font via preamble
    ])
})

plt.figure(figsize=(4.5, 2.5))
plt.plot(range(5))
plt.xlabel("unicode text: я, ψ, €, ü, \\unitfrac[10]{°}{µm}")
plt.ylabel("\\XeLaTeX")
plt.legend(["unicode math: $λ=∑_i^∞ μ_i^2$"])
plt.tight_layout(.5)

选择TEX系统

Matplotlib使用的TeX系统由 rcParams["pgf.texsystem"] (default: '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}",
    ]),
})

plt.figure(figsize=(4.5, 2.5))
plt.plot(range(5))
plt.text(0.5, 3., "serif", family="serif")
plt.text(0.5, 2., "monospace", family="monospace")
plt.text(2.5, 2., "sans-serif", family="sans-serif")
plt.xlabel(r"µ is not $\mu$")
plt.tight_layout(.5)

故障排除

  • 请注意,在一些Linux发行版和miktex安装中发现的tex包已经非常过时。请确保更新包目录并升级或安装最新的Tex发行版。
  • 在Windows上 PATH 可能需要修改环境变量,以包括包含LaTex、Dvipng和Ghostscript可执行文件的目录。见 环境变量在Windows中设置环境变量 有关详细信息。
  • 对Windows的限制会导致后端将应用程序打开的文件句柄保持打开状态。因此,在应用程序关闭之前,可能无法删除相应的文件(请参见 #1324
  • 有时保存到PNG图像中的图形中的字体呈现效果非常差。当pdftocairo工具不可用并且ghostscript用于PDF到PNG转换时,就会发生这种情况。
  • 确保您正在尝试的操作在LaTex文档中是可能的,确保您的LaTex语法有效,并且在必要时使用原始字符串以避免意外的转义序列。
  • rcParams["pgf.preamble"] (default: '') 提供了很大的灵活性,并且有很多方法会导致问题。遇到问题时,请尝试最小化或禁用自定义前导。
  • 配置一个 unicode-math 环境可能有点棘手。例如,TexLive发行版提供了一组通常不在系统范围内安装的数学字体。Xetex与LuaLaTex不同,无法通过它们的名称找到这些字体,因此您可能需要指定 \setmathfont{{xits-math.otf}} 而不是 \setmathfont{{XITS Math}} 或者使字体对操作系统可用。看到这个 `tex.stackexchange.com question`_ _了解更多详细信息。
  • 如果Matplotlib使用的字体配置与yout LaTeX文档中的字体设置不同,则导入的图形中文本元素的对齐方式可能会关闭。检查您的邮件标题 .pgf 如果您不确定用于布局的Matplotlib字体,请使用此文件。
  • 矢量图像,因此 .pgf 如果图中有很多对象,文件可能会膨胀。这可能是图像处理或非常大的散点图的情况。在极端情况下,这会导致TEX耗尽内存:“超出TEX容量,对不起”,您可以配置LaTex以增加可用于生成 .pdf 图像如上文所述 tex.stackexchange.com . 另一种方法是使用 rasterized=True 关键字,或 .set_rasterized(True) 按照 this example .
  • 如果您仍需要帮助,请参阅 得到帮助

关键词:matplotlib代码示例,codex,python plot,pyplot Gallery generated by Sphinx-Gallery