【发布时间】:2018-08-25 03:07:19
【问题描述】:
我从 Google 字体 下载了我想用于我的论文和所有绘图的字体,即 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/里还有更多文件
完整列表:
- AlegreyaSans-BlackItalic.ttf
- AlegreyaSans-BoldItalic.ttf
- AlegreyaSans-ExtraBoldItalic.ttf
- AlegreyaSans-Italic.ttf
- AlegreyaSans-Light.ttf
- AlegreyaSans-Medium.ttf
- AlegreyaSans-ThinItalic.ttf
- AlegreyaSans-Black.ttf
- AlegreyaSans-Bold.ttf
- AlegreyaSans-ExtraBold.ttf
- AlegreyaSans-LightItalic.ttf
- AlegreyaSans-MediumItalic.ttf
- AlegreyaSans-Regular.ttf
- AlegreyaSans-Thin.ttf
我的系统
- OpenSuse 13.1
- python 2.7
- matplotlib 1.4.3 版
【问题讨论】:
-
使用相同版本的 matplotlib 和 python,但在 mac (10.10.5) 上,我得到不同的结果。你得到
AlegreyaSans-Thin.ttf,我得到AlegreyaSans-Regular.ttf,你得到AlegreyaSans-ExtraBold.ttf,我得到AlegreyaSans-Bold.ttf。其他一切都是一样的。不确定这是否有帮助,但它至少添加了一个数据点! -
嗯,实际上,这很奇怪。如果字体直接在
$HOME/.fonts中,我在上面评论中的结果是正确的。如果我将它们移动到子目录$HOME/.fonts/Alegreya_Sans,就像你一样,我会得到和你一样的结果 -
@tom 这听起来很奇怪。怎么会这样?我想知道 matplotlib 使用什么来检测字体粗细。显然他们没有解析文件名:) 遗憾的是我不理解 fontList.cache 中的语法,所以即使手动修复也无法完成。还有什么想法吗?
-
@tom 我现在使用 .fonts 中没有子目录的所有 .ttf 文件检查了它。这更奇怪:我现在得到与你相同的输出,即 Thin 替换为 Regular 等等,但它仍然使用输出 pdf 中的 Thin-font。任何帮助表示赞赏。
-
您是否再次清除字体缓存?抱歉,我不太了解 font_manager 是如何工作的,但希望很快会有更多知识渊博的人出现 :)
标签: python-2.7 matplotlib