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也可以是一个字符串的情况下,你只有一个单一的目录要导入.
对于较新的 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)