我正在尝试在 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 的情况下使用相同的代码不会有任何问题。
如果在安装 matplotlib 后添加新字体,请尝试删除字体缓存。 Matplotlib 将必须重建缓存,从而添加新字体。
它可能位于
~/.matplotlib/fontList.cache
或 ~/.cache/matplotlib/fontList.json
下。
我使用 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 的所有可用字体。
对于 Mac 用户:尝试在 python 中运行此命令:(或在 .py 文件之前)
import matplotlib
matplotlib.font_manager._rebuild()
正如@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
以防万一有人想为其图表选择自定义字体。 您可以手动设置图表标签、标题、图例或刻度标签的字体。 以下代码演示了如何为图表设置自定义字体。 您提到的错误可以消失。
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)