我从 Google Fonts 下载了字体,我想将其用于论文和所有图表,即 Alegreya 字体系列。在将字体安装到$ HOME / .fonts后,我删除了.cache / matplotlib / fontList.cache,并在rcParams中创建了一个新的font.family ='Alegreya Sans'图。不幸的是,matplotlib检测到Alegreya Sans的 Thin 字体为 Regular 。以下最小示例:
说明了错误检测import matplotlib.font_manager
weights = ['ultralight', 'light', 'normal', 'regular', 'book', 'medium',
'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy',
'extra bold', 'black']
print 'weight'+6*' ', 'file name', '\n'+70*'-'
for weight in weights:
fprops = matplotlib.font_manager.FontProperties(family='Alegreya Sans',
weight=weight)
print weight+(12-len(weight))*' ', matplotlib.font_manager.findfont(fprops)
输出:
weight file name
----------------------------------------------------------------------
ultralight /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Light.ttf
light /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Light.ttf
normal /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Thin.ttf
regular /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Thin.ttf
book /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Thin.ttf
medium /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Medium.ttf
roman /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Medium.ttf
semibold /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
demibold /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
demi /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
bold /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
heavy /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
extra bold /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-ExtraBold.ttf
black /hmi/kme/.fonts/Alegreya_Sans/AlegreyaSans-Black.ttf
如何解决这个问题?为什么会这样?提前谢谢!
当然,文件夹/hmi/kme/.fonts/Alegreya_Sans /
中有更多文件完整列表:
答案 0 :(得分:2)
谢谢您的发布-尝试安装Fira Sans字体以与matplotlib配合使用时,我无法显示正确的字体粗细,因此遇到了类似的问题。对于将字体粗细与文件名相关联的诊断非常有用。
在Mac上,我删除了计算机上的所有Fira Sans .ttf文件并通过Font Book重新安装了initio,从而解决了我的问题。原来,当我不知道自己在做什么时,我以前曾在其他字体目录中放置了多个Fira Sans字体文件(包括FiraSans-Regular)。随后,当我尝试使用Font Book安装Fira Sans时,regular
字体无法正确安装,导致fontmanager选择了奇怪的字体。
tl; dr-如果您运行上面的诊断程序,但在给定的权重旁边看不到预期的文件名,请检查字体是否正确安装在Font Book中。
答案 1 :(得分:1)
我通过解决方法手动修复了问题。无论如何这似乎是一个错误。正如汤姆提到的,我将所有字体复制到$ HOME / .fonts 没有子目录。这改变了我在问题中给出的脚本的输出。为了找出错误,我试图以下列方式打印Alegreya和Alegreya Sans的 weight 和 style 的所有组合:
import matplotlib
matplotlib.use('Qt4Agg')
print matplotlib.get_backend()
import matplotlib.pyplot as plt
alignment = {'horizontalalignment':'center', 'verticalalignment':'baseline'}
alegreya_weights = { 'Alegreya': ['regular', 'bold', 'black'],
'Alegreya Sans': ['ultralight', 'light', 'regular',
'medium', 'bold', 'extra bold',
'black'] }
styles = ['normal', 'italic']
combinations = []
for family in alegreya_weights.keys():
for style in styles:
for weight in alegreya_weights[family]:
combinations.append((family, weight, style))
N = len(combinations)
def textPlot(ax, i, N, family, weight, style):
y = 1.-(1./float(N)) -float(i)/(float(N)+1)
ax.text(0.5, y, family+' '+weight+' '+style,
family=family, weight=weight, style = style,
fontsize = 30, **alignment)
fig = plt.figure(figsize=(8, .7*N), frameon=False)
ax = plt.gca()
ax.axis('off')
plt.xlim((0.,1.))
plt.ylim((0.,1.))
for i,c in enumerate(combinations):
textPlot(ax, i, N, c[0], c[1], c[2])
plt.show()
事实证明,只有AlegreyaSans-Regular.ttf被AlegreyaSans-Thin.ttf 取代。我无法确定这是否是由于" Thin"这个词被称为"超轻型"在matplotlib语法中。我取代了" AlegreyaSans-Thin.ttf" by" AlegreyaSans-Regular.ttf"在$ HOME / .cache / matplotlib / fontList.cache中解决了这个问题。
现在,以上图片来自上面的脚本。 未检测到薄(超轻)。
感谢汤姆提供任何帮助。