如何使用自定义路径设置自定义字体为Matplotlib全局字体?

24

我的应用中有一个自定义字体

app_path='/home/user1/myapp'
fname='/home/user1/myapp/font/myfont.ttf'

为了将全局字体设置到 matplotlib 中,文档中说得像这样:

plt.rcParams['font.sans-serif']=['xxx font']

但这仅适用于系统字体路径中已存在的字体,并且我必须在应用程序路径中使用我的自定义字体 '/home/user1/myapp/font/myfont.ttf'

我知道有一种方法可以这样做:

fname='/home/user1/myapp/font/myfont.ttf'
myfont=fm.FontProperties(fname=fname)
ax1.set_title('title test',fontproperties=myfont)

但这不是我想要的,我不想一直设置 'fontproperties' ,因为有太多的代码需要更改。


使用字体管理器,这就是它们的作用。当它们运行时,它们可以随时将字体作为系统字体提供,因此您可以在磁盘上逻辑地组织您的字体,同时像使用系统级安装的字体一样在应用程序中使用它们。 - Mike 'Pomax' Kamermans
你的意思是:myfont = fm.FontProperties(fname=fname) 吗? - dindom
3个回答

31

我这样解决了这个问题:

import matplotlib.font_manager as font_manager

font_dirs = ['/my/custom/font/dir', ]
font_files = font_manager.findSystemFonts(fontpaths=font_dirs)
font_list = font_manager.createFontList(font_files)
font_manager.fontManager.ttflist.extend(font_list)

mpl.rcParams['font.family'] = 'My Custom Font'

fontpaths参数也可以是一个字符串,以便在只有一个目录需要导入时使用。


5
非常有帮助!我还运行了这个命令来确定“我的自定义字体”应该用什么名称:[f.name for f in matplotlib.font_manager.fontManager.ttflist],这个命令出自于这篇帖子 - esperluette

24

2023年更新

最近我遇到了这个问题,并找到了最简单的处理方法。它不会干扰sys路径。

添加字体是重要的一步,否则字体将无法被检测到:

import matplotlib.pyplot as plt
from matplotlib import font_manager

font_path = 'Inter-Regular.otf'  # Your font path goes here
font_manager.fontManager.addfont(font_path)
prop = font_manager.FontProperties(fname=font_path)

plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = prop.get_name()

请注意,这需要matplotlib版本大于等于3.2。对于旧版本,addfont方法不存在,上述代码将会失败并显示AttributeError: 'FontManager' object has no attribute 'addfont'

1
我将你的代码片段插入到一个脚本中,但是系统报错:font_manager.fontManager.addfont(font_dir) && AttributeError: 'FontManager' 对象没有属性 'addfont'。 - afernandezody
这适用于最新的Matplotlib(3.5.1)。您是否尝试检查您的Matplotlib版本并卸载任何过时的版本? - gitnoob
是的,一旦我切换到v3版本,它确实起作用了。谢谢! - afernandezody
如果你想改变字体大小,请根据你的需求调整plt.rcParams['font.size'] - undefined

8

对于更新的 matplotlib 模块(例如版本 >=3.2)
createFontList 已经被弃用。

然而,您可以使用 ttf 文件路径和自定义名称创建字体条目,
然后将其添加到 fontManager.ttflist 中,并将 matplotlib.rcParams ['font.familt'] 分配给该名称。
现在,您可以开始制作图表,而不需要使用 'fontproperties' 等。

import matplotlib as mpl
import matplotlib.font_manager as fm

fe = fm.FontEntry(
    fname='your custom ttf file path',
    name='your custom ttf font name')
fm.fontManager.ttflist.insert(0, fe) # or append is fine
mpl.rcParams['font.family'] = fe.name # = 'your custom ttf font name'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接