注解
Click here 下载完整的示例代码
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