使用 matplotlib pgf 后端更改字体粗细

问题描述

问题

我使用 matplotlib 后端在 pgf 中创建带有注释的绘图,将它们保存为 pdf 文件。作为字体系列,我使用 Fira Sans 效果很好。但是,我无法将权重更改为粗体以外的值。

虽然我得到了类似的东西

Different font weights

使用 agg 后端时,pgf 后端仅区分常规字体和粗体字体:

Different font weights

理想情况下,我会使用 agg 后端重现 pgf 输出。说明我的问题的 mwe 是:

import matplotlib as mpl
from matplotlib import pyplot as plt

mpl.use('pgf')
# mpl.use('agg')
fg,ax=plt.subplots(figsize=(1,1))
ax.set_axis_off()
ax.annotate('text1',(0.1,0.9),xycoords='axes fraction',family='Fira Sans',weight='light')
ax.annotate('text1',0.7),weight='book')
ax.annotate('text1',0.5),weight='semibold')
ax.annotate('text1',0.3),weight='bold')

fg.savefig('pgfandfonts.png')

我尝试了什么

我的第一个想法是设置 rc.param pgf.rcfonts=True 但这不会影响结果。 显然我也改变了后端,但随后 matplotlib 开始将字体完全嵌入到创建的 pdf 中,这使得它们与使用 pgf 后端创建的文件相比非常大。

我也尝试过直接使用字体的文件名(例如 family='FiraSans-light.otf'),但也没有成功。

想法

  • 我可以将一些包/设置放入 pgf.preample 中,它们可以与 matplotlib 神奇地协同工作
  • 我找到了如何将字体的文件名路径到 pgf 后端并在 xelatex/fontspec 中使用 \renewcommand 和正确的 pgf.preamble方法
  • 有一种方法可以避免其他后端的巨大文件大小,例如只包含部分字体

解决方法

我发现 matplotlib 更喜欢 otf 类型的字体,即使我安装了 ttf 版本,它也不能作为 Type3 的子集。我通过复制 site-packages/matplotlib/mpl-data/fonts/ttf/ 中的所有 ttfs 并运行

解决了这个问题
from matplotlib.font_manager import _rebuild; _rebuild()

之后(见this blog entry)。现在文件大小又相对较小了。

然而,这不是原始问题的解决方案,因为当我想嵌入 type1 字体和/或使用 pgf 后端时它不起作用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)