如何设置自定义字体与matplotlib全局字体的自定义路径?

din*_*dom 6 python fonts matplotlib

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

app_path='/home/user1/myapp'
fname='/home/user1/myapp/font/myfont.ttf'
Run Code Online (Sandbox Code Playgroud)

要将globlal字体设置为matplotlib,文档会这样说:

plt.rcParams['font.sans-serif']=['xxx font']
Run Code Online (Sandbox Code Playgroud)

但它只适用于已经在系统字体路径中的字体,我必须在我的应用程序路径 '/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)
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的,我不想一直设置' fontproperties ',因为有一些代码要改变

git*_*oob 28

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()
Run Code Online (Sandbox Code Playgroud)

请注意,这需要 matplotlib>=3.2。对于旧版本,该addfont方法不存在,上面的方法将失败AttributeError: 'FontManager' object has no attribute 'addfont'


Geo*_*tob 12

解决了这样的问题:

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'
Run Code Online (Sandbox Code Playgroud)

fontpathskwarg也可以是一个字符串的情况下,你只有一个单一的目录要导入.

  • 它帮助了很多!我还运行了这个来检查这个 [post](/sf/ 21461155/change-matplotlibs-default-font) (5认同)

SCK*_*CKU 6

对于较新的 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'
Run Code Online (Sandbox Code Playgroud)