将 matplotlib 与具有非默认字体的乳胶模式一起使用

问题描述

我将 Windows 10 与 Anaconda 和 Spyder 4 一起使用。使用 matplotlib 时,我想使用字体 Proxima Nova 并使用 LaTeX 进行渲染。

如果在我的 matplotlibrc 文件中我指定

font.family : Proxima Nova

然后图形以字体 Proxima Nova 呈现。这意味着该字体已安装在我的系统上(原样)并且 matplotlib 可以使用它。但是,如果在 matplotlibrc 文件中我还指定了

text.usetex: True

然后,即使我已将 Proxima Nova 指定为字体,图形仍以认的 LaTeX 字体呈现,我猜是 Computer Modern

我试过了

matplotlib.font_manager._rebuild()

在源代码文件中,并且还尝试在源代码文件中而不是在 matplotlibrc 文件中指定字体。但是我总是得到相同的结果。我还遵循了 this help page 上的所有建议,包括确保 latex、dvipng 和 ghostscript 都是 PATH 变量。但是似乎没有任何效果

我想说明的是,我可以在编译 Latex 文档时单独使用 Proxima Nova,所以这也不应该成为问题。

如何让 matplotlib 能够使用非认字体并同时使用 LateX 进行渲染?

解决方法

经过进一步调查后,我能够将 Proxima NovaLatex 一起使用,但仍有一些未解决的问题。

主要问题是,如果字体 Proxima Nova 与 Latex 一起使用,则需要使用 Lualatex 而不是普通的 Latex。这是Matplotlib instruction on using matplotlib with Lualatex

让事情发挥作用的关键是 this post

在我的 .py 文件的最开始,我有以下代码:

import matplotlib as mpl

mpl.use("pgf")

mpl.rcParams.update({
    'font.family': 'sans-serif','text.usetex': True,'pgf.rcfonts': False,'pgf.texsystem': 'lualatex','pgf.preamble': r'\usepackage{fontspec} \setmainfont{Proxima Nova}',})

上面的代码应该放在代码的最顶部,在任何其他导入的上方

然而,问题是此解决方案仅在执行以下步骤后才有效:

  1. 删除 .matplotlib/tex.cache 文件夹并重启 spyder
  2. 分别用 'font.family': 'sans-serif'\setmainfont{Proxima Nova} 替换 'font.family': 'serif'\setmainfont{Times New Roman}。运行一次 python。
  3. 恢复到 'font.family': 'sans-serif'\setmainfont{Proxima Nova} 并再次运行 python。
  4. 生成具有正确字体的输出。

除非执行上述 4 个步骤,否则将使用默认的 DejaVu Sans 字体而不是 Proxima Nova 编译输出。我不知道为什么...

,

在 matplotlib github 论坛上获得帮助后,我被指出了以下解决方案:

mpl.rcParams.update({
'font.family': 'sans-serif','pgf.preamble': r'\usepackage{fontspec} \setsansfont{Proxima Nova}',})

换句话说,您需要使用 setsansfont 代替 setmainfont。你可以看到the matplotlib forum page here