matplotlib无法检测字体 [英] matplotlib does not detect font
问题描述
当我将fontname=
与Humor Sans
字体一起使用时,出现此错误:
/usr/lib/python3.5/site-packages/matplotlib/font_manager.py:1288: UserWarning: findfont: Font family ['Humor Sans', 'Comic Sans MS'] not found. Falling back to Bitstream Vera Sans
(prop.get_family(), self.defaultFamily[fontext]))
我已安装Humor Sans
.我使用archlinux,并安装了 ttf-humor-sans 软件包.>
我确保字体配置缓存fc-list
找到Humor Sans
字体:
$ fc-list | grep -i Humor
/usr/share/fonts/TTF/Humor-Sans-1.0.ttf: Humor Sans:style=Regular
在正确查看之后,这是一种错误.使用以下测试:
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
font_cache = [i for i in
fm.findSystemFonts(fontpaths=None, fontext='ttf')
if 'umor' in i]
for i in font_cache:
print(i)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1],[1],'o')
ax.set_title('My Title', fontname='Humor Sans')
#ax.set_title('My Title', fontname='Homemade Apple')
fig.savefig('tmp.png')
我已将Humor Sans
与Homemade Apple
(我打包为AUR软件包的免费Google字体)的行为进行了比较.问题是matplotlib
对fontname=
中指定的字体名称进行了匹配,该匹配不仅使用名称,还使用了字体的多个属性.在/home/grochmal/mat3/lib/python3.5/site-packages/matplotlib/font_manager.py
中,您将看到匹配项:
for font in fontlist:
if (directory is not None and
os.path.commonprefix([font.fname, directory]) != directory):
continue
# Matching family should have highest priority, so it is multiplied
# by 10.0
score = \
self.score_family(prop.get_family(), font.name) * 10.0 + \
self.score_style(prop.get_style(), font.style) + \
self.score_variant(prop.get_variant(), font.variant) + \
self.score_weight(prop.get_weight(), font.weight) + \
self.score_stretch(prop.get_stretch(), font.stretch) + \
self.score_size(prop.get_size(), font.size)
if score < best_score:
best_score = score
best_font = font
if score == 0:
break
不幸的是,Humor Sans
从未达到匹配阶段,因为并非所有prop.get_...
都可以填写.实质上,它永远都不会包含在fontlist
中.包含Homemade Apple
是因为它可以填充所有属性.
字体属性的差异如下所示:
[me@haps aur]# otfinfo --info /usr/share/fonts/TTF/HomemadeApple.ttf
Family: Homemade Apple
Subfamily: Regular
Full name: Homemade Apple
PostScript name: HomemadeApple
Preferred family: Homemade Apple
Preferred subfamily: Regular
Mac font menu name: Homemade Apple
Version: Version 1.000
Unique ID: FontDiner,Inc: Homemade Apple: 2010
Description: Copyright (c) 2010 by Font Diner, Inc. All rights reserved.
Designer: Font Diner, Inc
Designer URL: http://www.fontdiner.com
Manufacturer: Font Diner, Inc
Vendor URL: http://www.fontdiner.com
Trademark: Homemade Apple is a trademark of Font Diner, Inc.
Copyright: Copyright (c) 2010 by Font Diner, Inc. All rights reserved.
License URL: http://www.apache.org/licenses/LICENSE-2.0
License Description: Licensed under the Apache License, Version 2.0
Vendor ID: DINR
[me@haps aur]# otfinfo --info /usr/share/fonts/TTF/Humor-Sans-1.0.ttf
Family: Humor Sans
Subfamily: Regular
Full name: Humor Sans
PostScript name: HumorSans
Version: Version 2.9 28/3/09
Unique ID: Fontifier 2.9 (172) www.fontifier.com Humor Sans
Copyright: Copyright (c) Randall Munroe's biggest fan 2009. Created by www.fontifier.com. usa-1lip-4fvu15
Vendor ID: Alts
不需要Humor Sans
中的缺少字段,为了公平起见,在TTF中描述字体的方式存在一些不一致的地方(google italic 与 oblique 例如),因此也不是Humor Sans
错误.您的问题是文件格式的不一致性与缺乏处理这些问题的标准化代码的结合.
我建议找到看起来足够相似的其他字体.编辑TTF或matplotlib代码非常棘手,可能会导致其他问题.
When i use fontname=
with the Humor Sans
font I get this error:
/usr/lib/python3.5/site-packages/matplotlib/font_manager.py:1288: UserWarning: findfont: Font family ['Humor Sans', 'Comic Sans MS'] not found. Falling back to Bitstream Vera Sans
(prop.get_family(), self.defaultFamily[fontext]))
I have the Humor Sans
installed. I use archlinux and I installed the ttf-humor-sans package.
I have ensured that the font config cache fc-list
finds the Humor Sans
font:
$ fc-list | grep -i Humor
/usr/share/fonts/TTF/Humor-Sans-1.0.ttf: Humor Sans:style=Regular
Well, after properly looking at it, it is a kind of a bug. Using the following test:
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
font_cache = [i for i in
fm.findSystemFonts(fontpaths=None, fontext='ttf')
if 'umor' in i]
for i in font_cache:
print(i)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1],[1],'o')
ax.set_title('My Title', fontname='Humor Sans')
#ax.set_title('My Title', fontname='Homemade Apple')
fig.savefig('tmp.png')
I have compared the behaviour of the Humor Sans
against Homemade Apple
(a free google font that i package into an AUR package). And the issue is that matplotlib
does matching on the font names specified in fontname=
, the matching does not use only the name but several properties of the font. in /home/grochmal/mat3/lib/python3.5/site-packages/matplotlib/font_manager.py
you see the matching:
for font in fontlist:
if (directory is not None and
os.path.commonprefix([font.fname, directory]) != directory):
continue
# Matching family should have highest priority, so it is multiplied
# by 10.0
score = \
self.score_family(prop.get_family(), font.name) * 10.0 + \
self.score_style(prop.get_style(), font.style) + \
self.score_variant(prop.get_variant(), font.variant) + \
self.score_weight(prop.get_weight(), font.weight) + \
self.score_stretch(prop.get_stretch(), font.stretch) + \
self.score_size(prop.get_size(), font.size)
if score < best_score:
best_score = score
best_font = font
if score == 0:
break
Unfortunately Humor Sans
never reaches the matching phase because not all prop.get_...
can be filled in. In essence it never gets included into fontlist
. Homemade Apple
is included because it can fill all the properties.
The difference in font properties can be seen as follows:
[me@haps aur]# otfinfo --info /usr/share/fonts/TTF/HomemadeApple.ttf
Family: Homemade Apple
Subfamily: Regular
Full name: Homemade Apple
PostScript name: HomemadeApple
Preferred family: Homemade Apple
Preferred subfamily: Regular
Mac font menu name: Homemade Apple
Version: Version 1.000
Unique ID: FontDiner,Inc: Homemade Apple: 2010
Description: Copyright (c) 2010 by Font Diner, Inc. All rights reserved.
Designer: Font Diner, Inc
Designer URL: http://www.fontdiner.com
Manufacturer: Font Diner, Inc
Vendor URL: http://www.fontdiner.com
Trademark: Homemade Apple is a trademark of Font Diner, Inc.
Copyright: Copyright (c) 2010 by Font Diner, Inc. All rights reserved.
License URL: http://www.apache.org/licenses/LICENSE-2.0
License Description: Licensed under the Apache License, Version 2.0
Vendor ID: DINR
[me@haps aur]# otfinfo --info /usr/share/fonts/TTF/Humor-Sans-1.0.ttf
Family: Humor Sans
Subfamily: Regular
Full name: Humor Sans
PostScript name: HumorSans
Version: Version 2.9 28/3/09
Unique ID: Fontifier 2.9 (172) www.fontifier.com Humor Sans
Copyright: Copyright (c) Randall Munroe's biggest fan 2009. Created by www.fontifier.com. usa-1lip-4fvu15
Vendor ID: Alts
There missing fields from Humor Sans
are not required, to be fair there are several inconsistencies in how fonts are described inside TTF (google italic vs. oblique for an example) therefore it isn't Humor Sans
fault either. Your issue is a combination of inconsistencies in a file format with a lack of standardised code to deal with them.
I would suggest to find a different font that looks similar enough. Either editing the TTF or the matplotlib code is very tricky and might result in other problems.
这篇关于matplotlib无法检测字体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!