Matplotlib找不到字体

Pie*_*e B 8 python fonts matplotlib python-3.x

我试图在Python 3下用matplotlib(版本1.4.2)绘制一个xkcd风格的图.

当我尝试运行时:

import matplotlib.pyplot as plt
plt.xkcd()
plt.plot([1,2,3,4], [1,4,9,16], 'bo')
plt.axis([0, 6, 0, 20])
plt.show()
Run Code Online (Sandbox Code Playgroud)

它打开一个没有任何图像的空窗口,我收到错误:

/usr/lib/python3/dist-packages/matplotlib/font_manager.py:1279: UserWarning: findfont: Font family ['Humor Sans', 'Comic Sans MS', 'StayPuft'] not found. Falling back to Bitstream Vera Sans
  (prop.get_family(), self.defaultFamily[fontext]))
/usr/lib/python3/dist-packages/matplotlib/font_manager.py:1289: UserWarning: findfont: Could not match :family=Bitstream Vera Sans:style=normal:variant=normal:weight=normal:stretch=normal:size=medium. Returning /usr/share/matplotlib/mpl-data/fonts/ttf/STIXSizOneSymReg.ttf
  UserWarning) Exception in Tkinter callback
Run Code Online (Sandbox Code Playgroud)

我安装了Humor Sans.我查了一下fc-list | grep Humor.它也可以在Libre Office等其他程序中使用.我也安装了staypuft.还不够吗?

上面相同的代码,但没有plt.xkcd()位完美无缺.

plt.show()的替代方法,如pylab.savefig()对xkcd代码不起作用,但在不使用xkcd的情况下对相同代码没有任何问题.

nev*_*ves 14

我使用 apt-get 在 WSL2 下的 Ubuntu 中安装了字体,但 matplotlib 无法使用它们。

在 JupyterLab 中使用 matplotlib 版本 3.4.2 在安装新字体以使其可用后,我必须执行以下步骤。

首先,删除 matplotlib 缓存目录:

import shutil
import matplotlib

shutil.rmtree(matplotlib.get_cachedir())
Run Code Online (Sandbox Code Playgroud)

缓存位置可能会根据您的安装而变化。上面的代码保证您将删除适合您的内核的正确代码。

现在重新启动您的笔记本内核。

然后在笔记本单元格中使用以下命令测试新字体是否出现:

import matplotlib.font_manager
from IPython.core.display import HTML

def make_html(fontname):
    return "<p>{font}: <span style='font-family:{font}; font-size: 24px;'>{font}</p>".format(font=fontname)

code = "\n".join([make_html(font) for font in sorted(set([f.name for f in matplotlib.font_manager.fontManager.ttflist]))])

HTML("<div style='column-count: 2;'>{}</div>".format(code))
Run Code Online (Sandbox Code Playgroud)

上面的代码将显示 matplotlib 的所有可用字体。


小智 9

对于 Mac 用户:尝试在 python 中运行此命令:(或在 .py 文件之前)

import matplotlib

matplotlib.font_manager._rebuild()
Run Code Online (Sandbox Code Playgroud)

  • 在 matplotlib 3.4.2 中,字体管理器没有属性 `_rebuild`。我也找不到字体缓存。 (19认同)
  • 至少在“matplotlib”“v3.3.2”中,“matplotlib.font_manager”在导入“matplotlib”时是未知的,因此您需要执行“``import matplotlib.font_manager;” matplotlib.font_manager._rebuild() ``` (3认同)

Cli*_*err 7

正如@neves 指出的那样,matplotlib.font_manager._rebuild()不再有效。作为手动删除缓存目录的替代方法,Matplotlib 3.4.3 的工作原理是:

import matplotlib.font_manager
matplotlib.font_manager._load_fontmanager(try_read_cache=False)
Run Code Online (Sandbox Code Playgroud)

这是该函数的 Matplotlib 源代码:

def _load_fontmanager(*, try_read_cache=True):
    fm_path = Path(
        mpl.get_cachedir(), f"fontlist-v{FontManager.__version__}.json")
    if try_read_cache:
        try:
            fm = json_load(fm_path)
        except Exception as exc:
            pass
        else:
            if getattr(fm, "_version", object()) == FontManager.__version__:
                _log.debug("Using fontManager instance from %s", fm_path)
                return fm
    fm = FontManager()
    json_dump(fm, fm_path)
    _log.info("generated new fontManager")
    return fm
Run Code Online (Sandbox Code Playgroud)


Ser*_*ity 6

如果您在安装matplotlib后添加新字体,则尝试删除~/.matplotlib/fontList.cache并且matplotlib必须重建字体.

  • 我搜索了fontList,发现它在〜/ .cache/matplotlib/fontList.py3k.cache.删除它会使上面的代码再次起作用. (5认同)
  • 是的,matplotlib配置文件的位置由操作系统定义. (2认同)
  • 您可以通过运行“import matplotlib as mpl;”找到缓存的目录。打印(mpl.get_cachedir())` (2认同)