问题
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
回答1:
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.
来源:https://stackoverflow.com/questions/37407894/matplotlib-does-not-detect-font