Matplotlib字体未找到。

30

我想在我的matplotlib图中使用"Heuristica"字体,但它不会显示出来。

我将"Heuristica"定义在rcParameter字体.serif的第一个位置上 --> 没有结果

我将font.family更改为"Heuristica",然后收到了一条消息

findfont: FontFamily not found

这让我思考了一下,因为Heuristica已经安装好了,我可以从其他软件中无问题地访问它。所以我使用了fontManager并执行了以下操作:

import pylab as pl
la = pl.matplotlib.font_manager.FontManager()
lu = pl.matplotlib.font_manager.FontProperties(family = 'Heuristica')
la.findfont(lu)

得到:

Out[7]: 'C:\\Windows\\Fonts\\Heuristica-Regular.otf'

显然可以找到Heuristica字体。我查看了可用的ttf字体(如何在matplotlib中获取字体族或字体名称列表),但是Heuristica不在此列表中。

我会很感激任何帮助。


你使用的 mpl 版本是什么? - tacaswell
我正在使用1.3.1版本。 - MichaelA
请尝试更新到1.4.0版本。如果还不行,请在GitHub上创建一个问题。 - tacaswell
2
问题在1.4.0版本下仍然存在。您确定这真的是Github的问题,而不是我电脑前面的人的问题吗?关于Github问题:我可以链接到这个问题吗,还是需要复制粘贴? - MichaelA
请在问题描述中提供足够的信息,确保我们不必链接回 Stack Overflow。这里的问题并不稳定(因为编辑和删除)。请提供足够的详细信息,以便使用 Windows 机器的人可以复制它(包括如果您已更改了 rcparam 文件和完整的 traceback)。 - tacaswell
我们现在在Github上有一个问题:#3590 - MichaelA
2个回答

53

嗯,mdboom在 github 解决了这个问题,所有功劳都归于他:

当您向系统添加新字体时,您需要删除 fontList.cache 文件,以便 matplotlib 可以找到它们。

在你的示例中第4/5行可以工作是因为你正在从头开始创建FontManager(它会到文件系统中查找所有的字体)。在内部,当matplotlib稍后执行自己的字体查找时,它使用一个从磁盘上的 fontList.cache 文件中加载的 FontManager 来进行查找。

长期来看,我们计划切换到使用操作系统的字体查找机制来解决此问题(请参见 MEP14),但与此同时,每次想要 matplotlib 发现新字体时,都需要删除 fontList.cache 文件。

fontList.cache 文件位于您的用户文件夹下 --> .matplotlib/fontList.cache ,对于 Windows 用户来说,通常会在 C:\Users\yourUsername\.matplotlib\fontList.cache 目录下。


23
Ubuntu 上的 ~/.cache/matplotlib。 (翻译:The ~/.cache/matplotlib on Ubuntu.) - imrek
2
我只在Windows上尝试了这个解决方案,无法在Linux上进行测试。但也许你想在Github问题中添加一些内容,这可能是获得错误修复的最佳方式:https://github.com/matplotlib/matplotlib/issues/3590 - MichaelA
6
我也必须删除fontList.json - mcmayer
6
强制Matplotlib重新构建缓存可能是最跨平台的解决方案,使用import matplotlib.font_manager as font_manager; font_manager._rebuild() - raphael
3
对我来说,该文件名为 fontlist-v330.json - SWdV
显示剩余4条评论

3

对于某些版本的Matplotlib,可能需要清除_get_fontconfig_fonts()的LRU缓存(以及删除fontList.cache文件)。

fm = matplotlib.font_manager
fm._get_fontconfig_fonts.cache_clear()

这个函数负责在Linux/Unix系统上调用并缓存fc-list。如果您的字体出现在fc-list中,但在Matplotlib的字体中没有出现,即使删除了fontList.cache文件,这可能是罪魁祸首。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接