问题描述
我将 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 Nova
与 Latex
一起使用,但仍有一些未解决的问题。
主要问题是,如果字体 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}',})
上面的代码应该放在代码的最顶部,在任何其他导入的上方。
然而,问题是此解决方案仅在执行以下步骤后才有效:
- 删除 .matplotlib/tex.cache 文件夹并重启 spyder
- 分别用
'font.family': 'sans-serif'
和\setmainfont{Proxima Nova}
替换'font.family': 'serif'
和\setmainfont{Times New Roman}
。运行一次 python。 - 恢复到
'font.family': 'sans-serif'
和\setmainfont{Proxima Nova}
并再次运行 python。 - 生成具有正确字体的输出。
除非执行上述 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。