matplotlib使用 LaTeX 进行文本渲染

matplotlib使用 LaTeX 进行文本渲染

Matplotlib可以使用LaTeX来渲染文本。这是通过在rcParams中设置 text.usetex : True 来激活,或者通过在单个 Text 对象上将 usetex 属性设置为 True 来激活。通过LaTeX进行的文本处理比Matplotlib功能强大的mathtext慢,但更灵活,因为可以使用不同的LaTeX包(字体包、数学包等)。结果可能是惊人的,尤其是当你注意在图中使用与主文档中相同的字体时。

Matplotlib对LaTeX的支持需要一个可工作的LaTeX安装。对于*Agg后端,还需要dvipng;对于PS后端,还需要PSfrag、dvip和Ghostscript。对于PDF和SVG后端,如果存在LuaTeX,它将用于加快一些后处理步骤,但请注意,它不用于解析TeX字符串本身(仅支持LaTeX)。这些外部依赖项的可执行文件必须全部位于您的PATH上。
仅支持少量字体系列(由PSNFSS方案定义)。这里列出了它们,以及相应的LaTeX字体选择命令和LaTeX包,它们将被自动使用。

generic family fonts
serif (\rmfamily) Computer Modern Roman, Palatino (mathpazo), Times (mathptmx), Bookman (bookman), New Century Schoolbook (newcent), Charter (charter)
sans-serif (\sffamily) Computer Modern Serif, Helvetica (helvet), Avant Garde (avant)
cursive (\rmfamily) Zapf Chancery (chancery)
monospace (\ttfamily) Computer Modern Typewriter, Courier (courier)

默认的字体系列(不需要加载任何LaTeX包)是Computer Modern。所有其他族都是Adobe字体。Times和Palatino都有自己的数学字体,而其他Adobe serif fonts (衬线字体) 则使用了Computer Modern数学字体。

要启用 LaTeX 并选择字体,请使用例如:

plt.rcParams.update({
    "text.usetex": True,
    "font.family": "Helvetica"
})

或等效地,将您的matplotlibrc设置为:

text.usetex : true
font.family : Helvetica

也可以改为设置font.family为通用系列名称之一,然后配置相应的通用系列;例如:

plt.rcParams.update({
    "text.usetex": True,
    "font.family": "sans-serif",
    "font.sans-serif": "Helvetica",
})

(在 Matplotlib 3.5 之前,这是必需的方法)。

这是标准示例, 使用 TeX 渲染数学方程

请注意,不支持显示数学模式 ( $$ e=mc^2 $$),但添加命令 \displaystyle,如上面的演示,将产生相同的结果。

非 ASCII 字符(例如上面 y 标签中的度数符号)在inputenc支持的范围内得到支持。

注意:

为了与非 usetex 情况保持一致,Matplotlib 特殊情况下换行,以便单个换行产生换行符(而不是在标准 LaTeX 中被解释为空格)。

Matplotlib 使用underscore包,因此下划线 ( _) 在文本模式下“按原样”打印(而不是像在标准 LaTeX 中那样导致错误)。下划线仍然在数学模式中引入下标。

注意:

某些字符需要在 TeX 中进行特殊转义,例如:

# $ % & ~ ^ \ { } \( \) \[ \]

因此,这些字符的行为会有所不同 rcParams["text.usetex"](默认值:False)。如上所述,下划线 ( _) 不需要在数学模式之外转义。

PostScript 选项

为了生成可以嵌入到新 LaTeX 文档中的封装 PostScript (EPS) 文件,Matplotlib 的默认行为是提取输出,这会删除 LaTeX 使用的一些在 EPS 文件中非法的 PostScript 运算符。此步骤会产生一些用户可能无法接受的结果,因为文本被粗略地光栅化并转换为位图,它不像标准 PostScript 那样可缩放,并且文本不可搜索。一种解决方法是在 rc 设置中将rcParams["ps.distiller.res"](默认6000值:)设置为更高的值(可能是 6000),这将生成更大的文件,但可能看起来更好并且可以合理扩展。需要PopplerXpdf的更好的解决方法可以通过将rcParams["ps.usedistiller"](默认值None:)更改为来激活xpdf. 这种替代方法可以生成 PostScript 而不对文本进行光栅化,因此它可以正确缩放,可以在 Adobe Illustrator 中进行编辑,并可以在 pdf 文档中搜索文本。

可能出现的故障

  • 在 Windows 上,PATH可能需要修改环境变量以包含包含latex、dvipng 和ghostscript 可执行文件的目录。有关详细信息,请参阅环境变量在 Windows中设置环境变量。
  • 将 MiKTeX 与 Computer Modern 字体一起使用,如果您得到奇怪的 *Agg 和 PNG 结果,请转到 MiKTeX/Options 并更新您的格式文件
  • 在 Ubuntu 和 Gentoo 上,基本的 texlive 安装不附带 type1cm 包。您可能需要安装一些额外的软件包才能获得与其他 LaTeX 发行版捆绑在一起的所有好东西。
  • 已经取得了一些进展,因此 Matplotlib 直接使用 dvi 文件进行文本布局。这允许 LaTeX 用于带有 pdf 和 svg 后端以及 *Agg 和 PS 后端的文本布局。将来,LaTeX 安装可能是唯一的外部依赖项。

故障排除

  • 尝试删除您的.matplotlib/tex.cache目录。如果您不知道在哪里可以找到.matplotlib,请参阅matplotlib 配置和缓存目录位置
  • 确保 LaTeX、dvipng 和 ghostscript 都可以正常工作并在您的 PATH.
  • 确保您尝试在 LaTeX 文档中执行的操作是可能的,确保您的 LaTeX 语法有效,并且在必要时使用原始字符串以避免意外的转义序列。
  • rcParams["text.latex.preamble"](默认值:)''不受官方支持。这个选项提供了很大的灵活性,以及很多导致问题的方法。请在向邮件列表报告问题之前禁用此选项。
  • 如果您仍需要帮助,请参阅获得帮助

Download Python source code: usetex.py

Download Jupyter notebook: usetex.ipynb

安装缺失的包

Linux -> Ubuntu

  1. 安装 latex

FileNotFoundError: [Errno 2] No such file or directory: ‘latex’: ‘latex’.
由于在系统中没有找到 Latex ,因此安装:

# 查看系统中是否安装 latex
whereis latex
## 如果返回是空值,则安装
sudo apt install texlive-fonts-recommended texlive-fonts-extra
sudo apt install dvipng
  1. 安装 cm-super

RuntimeError: latex was not able to process the following string: b‘lp‘

sudo apt-get install cm-super

Window

If you are looking to install a complete system, we recommend TeX Live for Unix/GNU/Linux, MacTeX for MacOSX, and MiKTeX for Windows (though both TeX Live and MiKTeX support all common platforms). These distributions are (almost entirely) free software and can be downloaded and installed at no charge. See their home pages.

注意:MiKTeX 仅仅需要在 macOS下手动配置路径,window/Linux 下安装时自动配置

reference

@misc{BibEntry2023Mar,
title = { {使用 LaTeX 进行文本渲染 {\ifmmode—\else\textemdash\fi} Matplotlib 3.7.1 文档}},
year = {2023},
month = mar,
note = {[Online; accessed 22. May 2023]},
url = {https://matplotlib.org/stable/tutorials/text/usetex.html}
}
@misc{BibEntry2023May,
title = { {使用 LaTeX 进行文本渲染{ _ \_ _}Matplotlib 中文网}},
year = {2023},
month = may,
note = {[Online; accessed 22. May 2023]},
url = {https://matplotlib.net/stable/tutorials/text/usetex.html}
}
@misc{BibEntry2023May,
title = { {Matplotlib error: No such file or directory: ‘latex’: ‘latex’}},
journal = {TeX - LaTeX Stack Exchange},
year = {2023},
month = may,
note = {[Online; accessed 22. May 2023]},
url = {https://tex.stackexchange.com/questions/475546/matplotlib-error-no-such-file-or-directory-latex-latex}
}
@misc{BibEntry2023May,
title = { {Getting started with TeX, LaTeX, and friends - TeX Users Group}},
year = {2023},
month = may,
note = {[Online; accessed 28. May 2023]},
url = {https://tug.org/begin.html}
}
@misc{BibEntry2023May,
title = { {RuntimeError: Failed to process string with tex because latex could not be found}},
journal = {Stack Overflow},
year = {2023},
month = may,
note = {[Online; accessed 28. May 2023]},
url = {https://stackoverflow.com/questions/58121461/runtimeerror-failed-to-process-string-with-tex-because-latex-could-not-be-found}
}

猜你喜欢

转载自blog.csdn.net/orDream/article/details/130804981