Matplotlib 找不到我的 Linux 机器中安装的字体

问题描述 投票:0回答:5

我正在尝试在 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()

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

/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

我安装了 Humor Sans。我用

fc-list | grep Humor
检查过。它还可以在其他程序中使用,例如 Libre Office。我还安装了staypuft。这还不够吗?

上面相同的代码,但没有 plt.xkcd() 位,可以完美地工作。

plt.show() 的替代方案,如 pylab.savefig() 也不适用于 xkcd 代码,但在不使用 xkcd 的情况下使用相同的代码不会有任何问题。

python python-3.x matplotlib fonts
5个回答
26
投票

如果在安装 matplotlib 后添加新字体,请尝试删除字体缓存。 Matplotlib 将必须重建缓存,从而添加新字体。

它可能位于

~/.matplotlib/fontList.cache
~/.cache/matplotlib/fontList.json
下。


15
投票

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

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

首先,删除matplotlib缓存目录:

import shutil
import matplotlib

shutil.rmtree(matplotlib.get_cachedir())

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

如果缓存为空,matplotlib 将在下次重建它。

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

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

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))

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


8
投票

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

import matplotlib

matplotlib.font_manager._rebuild()

8
投票

正如@neves 指出的,

matplotlib.font_manager._rebuild()
不再起作用。作为手动删除缓存目录的替代方法,Matplotlib 3.4.3 的工作原理是:

import matplotlib.font_manager
matplotlib.font_manager._load_fontmanager(try_read_cache=False)

这是该函数的 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

4
投票

以防万一有人想为其图表选择自定义字体。 您可以手动设置图表标签、标题、图例或刻度标签的字体。 以下代码演示了如何为图表设置自定义字体。 您提到的错误可以消失。

import matplotlib.font_manager as fm
import matplotlib.pyplot as plt

font_path = '/System/Library/Fonts/PingFang.ttc'  # the location of the font file
my_font = fm.FontProperties(fname=font_path)  # get the font based on the font_path

fig, ax = plt.subplots()

ax.bar(x, y, color='green')
ax.set_xlabel(u'Some text', fontproperties=my_font)
ax.set_ylabel(u'Some text', fontproperties=my_font)
ax.set_title(u'title', fontproperties=my_font)
for label in ax.get_xticklabels():
    label.set_fontproperties(my_font)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.