Matplotlib is hiring a Research Software Engineering Fellow! See discourse for details. Apply by January 3, 2020

Version 3.1.1
matplotlib
Fork me on GitHub

目录

Related Topics

Xeletex/Luamatex排版

如何使用 pgf Matplotlib中的后端。

使用 pgf 后端,matplotlib可以将图形导出为pgf绘图命令,可以使用pdflatex、xelatex或lualatex进行处理。Xeletex和LuaLaTex完全支持Unicode,可以使用操作系统中安装的任何字体,利用OpenType、AAT和石墨的高级排版功能。PGF图片创建者 plt.savefig('figure.pgf') 可以作为原始命令嵌入到 Latex 文档中。图形也可以直接编译并保存到PDF中。 plt.savefig('figure.pdf') 通过切换到后端

matplotlib.use('pgf')

或者注册它来处理PDF输出

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

第二种方法允许您继续使用常规的交互式后端,并从图形用户界面保存Xeletex、LuaLaTex或PDFlatex编译的PDF文件。

Matplotlib的PGF支持需要 LaTeX 包括tikz/pgf包的安装(例如 TeXLive) ,最好安装Xeletex或LuaLaTex。如果系统中存在pdfocairo或ghostscript,图形也可以选择保存到PNG图像中。所有应用程序的可执行文件必须位于 PATH .

控制PGF后端行为的rc参数:

参数 文档
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的字体通常在matplotlib rc参数中定义。您也可以通过清除列表使用 Latex 默认计算机现代字体 font.seriffont.sans-seriffont.monospace . 请注意,这些字体的字形覆盖范围非常有限。如果要保持计算机的现代字体,但需要扩展的Unicode支持,请考虑安装 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)

自定义前导

通过在前言中添加您自己的命令,完全定制是可能的。使用 pgf.preamble 参数,如果要配置数学字体,请使用 unicode-math 例如,或用于加载其他包。另外,如果要自己进行字体配置,而不是使用rc参数中指定的字体,请确保禁用 pgf.rcfonts .

"""
============
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": [
         "\\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系统由 pgf.texsystem 参数。可能的值是 'xelatex' (默认) 'lualatex''pdflatex' . 请注意,在选择pdflatex时,必须在前言中配置字体和Unicode处理。

"""
=============
Pgf Texsystem
=============

"""

import matplotlib.pyplot as plt
plt.rcParams.update({
    "pgf.texsystem": "pdflatex",
    "pgf.preamble": [
         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语法有效,并且在必要时使用原始字符串以避免意外的转义序列。
  • 这个 pgf.preamble RC设置提供了许多灵活性,以及许多导致问题的方法。遇到问题时,请尝试最小化或禁用自定义前导码。
  • 配置一个 unicode-math 环境可能有点棘手。例如,TexLive发行版提供了一组通常不在系统范围内安装的数学字体。Xetex与LuaLaTex不同,无法通过它们的名称找到这些字体,因此您可能需要指定 \setmathfont{{xits-math.otf}} 而不是 \setmathfont{{XITS Math}} 或者使字体对操作系统可用。看到这个 tex.stackexchange.com question 了解更多详细信息。
  • 如果matplotlib使用的字体配置与您的LaTex文档中的字体设置不同,则导入的图形中文本元素的对齐可能会关闭。检查你的标题 .pgf 如果您不确定用于布局的matplotlib字体,请提交文件。
  • 矢量图像,因此 .pgf 如果图中有很多对象,文件可能会膨胀。这可能是图像处理或非常大的散点图的情况。在极端情况下,这会导致TEX耗尽内存:“超出TEX容量,对不起”,您可以配置LaTex以增加可用于生成 .pdf 图像如上文所述 tex.stackexchange.com . 另一种方法是使用 rasterized=True 关键字,或 .set_rasterized(True) 按照 this example .
  • 如果您仍需要帮助,请参阅 得到帮助