Matplotlib is hiring a Research Software Engineering Fellow! See discourse for details. Apply by January 3, 2020
如何使用 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定义一组特殊字符,例如:
# $ % & ~ _ ^ \ { }
通常,这些字符必须正确转义。为了方便起见,有些字符 (_, ^(%)将自动从数学环境之外转义。
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.serif
, font.sans-serif
或 font.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)
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)
PATH
可能需要修改环境变量,以包括包含LaTex、Dvipng和Ghostscript可执行文件的目录。见 环境变量 和 在Windows中设置环境变量 有关详细信息。pgf.preamble
RC设置提供了许多灵活性,以及许多导致问题的方法。遇到问题时,请尝试最小化或禁用自定义前导码。unicode-math
环境可能有点棘手。例如,TexLive发行版提供了一组通常不在系统范围内安装的数学字体。Xetex与LuaLaTex不同,无法通过它们的名称找到这些字体,因此您可能需要指定 \setmathfont{{xits-math.otf}}
而不是 \setmathfont{{XITS Math}}
或者使字体对操作系统可用。看到这个 tex.stackexchange.com question 了解更多详细信息。.pgf
如果您不确定用于布局的matplotlib字体,请提交文件。.pgf
如果图中有很多对象,文件可能会膨胀。这可能是图像处理或非常大的散点图的情况。在极端情况下,这会导致TEX耗尽内存:“超出TEX容量,对不起”,您可以配置LaTex以增加可用于生成 .pdf
图像如上文所述 tex.stackexchange.com . 另一种方法是使用 rasterized=True
关键字,或 .set_rasterized(True)
按照 this example .