Matplotlib找不到安装在Linux机器上的字体

mnemlml8  于 2022-12-23  发布在  Linux
关注(0)|答案(5)|浏览(251)

我试图在Python 3下用matplotlib(ver.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()位,可以完美地工作。
www.example.com()的替代方法plt.show,比如pylab.savefig(),对xkcd代码也不起作用,但是如果不使用xkcd,对相同的代码也没有任何问题。

von4xj4u

von4xj4u1#

如果你在安装matplotlib之后添加了一个新字体,然后尝试删除字体缓存。Matplotlib将不得不重建该高速缓存,从而添加新字体。
它可能位于~/.matplotlib/fontList.cache~/.cache/matplotlib/fontList.json下。

jogvjijk

jogvjijk2#

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

import matplotlib

matplotlib.font_manager._rebuild()
62lalag4

62lalag43#

我在Ubuntu中使用apt-get在WSL 2下安装了字体,但它们对matplotlib不可用。
在JupyterLab中使用matplotlib版本3.4.2时,我必须在安装新字体后执行以下步骤才能使其可用。
首先,删除matplotlib缓存目录:

import shutil
import matplotlib

shutil.rmtree(matplotlib.get_cachedir())

该高速缓存位置可以根据你的安装而改变。上面的代码保证了你会为你的内核删除正确的缓存。
现在 * 重新启动 * 您的笔记本内核。
然后使用此命令测试新字体是否出现在笔记本单元格中:

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的所有可用字体。

iszxjhcz

iszxjhcz4#

正如@neves所指出的,matplotlib.font_manager._rebuild()不再起作用。作为手动删除该高速缓存目录的替代方法,Matplotlib 3.4.3起的作用是:

import matplotlib
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
mbjcgjjk

mbjcgjjk5#

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

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)

相关问题