Matplotlib 找不到基本字体

Matplotlib cannot find basic fonts

我在 Python 3 上的 miniconda 虚拟环境中使用 matplotlib 版本 2.0.0。我在没有 root 权限的 unix 科学计算集群上工作。我通常通过 ipython 笔记本执行 python 代码。如果我执行基本命令,例如:

import matplotlib.pyplot as plt
plt.scatter([1,5], [1,5])

我收到一条错误消息:

path_to_miniconda/miniconda3/envs/conda34/lib/python3.4/site-
packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family
['sans-serif'] not found. Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))

我希望能够使用 Times New Roman 字体,但即使删除了我从此处找到的字体缓存文件 (fontList.py3k.cache):

import matplotlib as mpl
fm = mpl.font_manager
fm.get_cachedir()

命令:

mpl.rcParams['font.family'] = ['serif']
mpl.rcParams['font.serif'] = ['Times New Roman']

没有效果,我得到和上面一样的错误。真实字体目录:

path_to_miniconda/miniconda3/envs/conda34/lib/python3.4/site-packages/matplotlib/mpl-data/fonts/ttf/

里面只有40种字体:DejaVuSerif,DejaVuSans,STIX,cmb,cmt,cmy

知道会发生什么以及如何添加其他字体吗?谢谢!

这对我有用::

$ sudo apt-get install msttcorefonts -qq

我在 Vagrant VM 运行 Ubuntu Xenial 64 位上遇到了完全相同的问题。无论我已经安装了多少字体,matplotlib 都会遇到 "system" 字体名称 "sans-serif" 的问题。我通过以下方式修复了它:

  • 停止 Jupyter
  • 正在安装字体管理器:sudo apt install font-manager
  • 清理matplotlib缓存目录:rm ~/.cache/matplotlib -fr
  • 正在重启 Jupyter。

没有更多关于 sans-serif 的错误消息。

Windows 用户遇到警告时的解决方案:

UserWarning: findfont: Font family ['serif'] not found. Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))
  1. 删除matplotlib缓存中的字体。
    缓存位置:import matplotlib as mpl; print(mpl.font_manager.get_cachedir())

  2. 找到matplotlib的字体目录。该路径可能类似于
    C:\Miniconda3\pkgs\matplotlib-2.2.2-py36_1\Lib\site-packages\matplotlib\mpl-data\fonts\ttf

  3. 复制必要的字体如Computer Modern到此目录。

警告可能会持续存在,但您绘图的字体应该适当更改。

为了让它发挥作用,我必须结合当前的两个最佳答案。以下是对我有用的方法:

$ sudo apt install msttcorefonts -qq
$ rm ~/.cache/matplotlib -rf

我在 gcloud VM 上的 Cloud Datalab docker 图像 运行 中遇到了类似的问题。执行以下命令为我解决了问题:

$ sudo apt install msttcorefonts -qq
$ rm ~/.cache/matplotlib -rf

Here 是有关如何在包含 Datalab 实例的 gcloud VM 上获取 docker 图像 运行 以防万一的说明。

上面的方法都试过了,我都不行

我解决这个问题的方法有点麻烦,因为我在 ubuntu 服务器 运行 jupyter

上使用 conda
locate -b '\mpl-data'

找到一个文件夹

/usr/share/matplotlib/mpl-data

然后我将 simhei 字体添加到 mpl-data 的字体文件夹中。 然后删除 matplotlib 字体缓存

rm -rf ~/.cache/matplotlib

重启 jupyter notebook,就可以了。

我在 macOS 中使用 jupyter notebook,我用以下方法解决了,首先关闭你的 jupyter notebook。然后通过在Python

中执行以下操作找出字体路径
import matplotlib
print(matplotlib.matplotlib_fname())

它为我打印 /Users/zyy/anaconda2/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc,注意 matplotlibrc 是文件,而不是目录。

然后下载字体SimHei,复制到上面mpl-data/目录下的fonts/ttf目录下

删除目录~/.cache/matplotlib并重启你的jupyter notebook,一切正常。

我花了好几个小时才终于明白我需要更新 matplotlib。

我原来的 3.0.3 版本(我的 jupyter-datascience docker 图片附带)会给我这个错误,但更新到 3.1.1 修复了它。

最后,我的 docker 脚本:

RUN pip install matplotlib==3.1.1
COPY fonts /usr/share/fonts/truetype/
RUN fc-cache -fv
RUN rm /home/jovyan/.cache/matplotlib -rf

是为我做的。

我居然解决了

import matplotlib.font_manager

它有一个 conda 包[1]。 所以,你真的不需要 sudo 来解决这个问题!

conda install -c conda-forge -y mscorefonts

更新:以下功能在最近的 matplotlib 中被破坏(不再适用于 v3.4.3)

Also, if you dont want to restart jupyter, you can force rebuild matplotlib font cache

import matplotlib
matplotlib.font_manager._rebuild()

[1] - https://anaconda.org/conda-forge/mscorefonts

我在使用 anaconda env 时遇到了这个问题(它在其他相关情况下也很有用)。 例如,对于基本环境,我检查了以下目录: /home/***/anaconda3/pkgs/matplotlib-base-3.1.3-py37hef1b27d_0/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/

并注意到我在那里安装了 DejaVuSerif.ttf,所以不用 plt.rcParams['font.family'] = 'Serif' 我用了 plt.rcParams['font.family'] = 'DeJavu Serif' (“DeJavu 和衬线”之间有一个 space)。我为我工作。

import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'DeJavu Serif'
plt.rcParams['font.serif'] = ['Times New Roman']

对于 windows 用户

  1. 使用
  2. 进入matplotlib的缓存目录即可

将 matplotlib 导入为 mpl

打印(mpl.font_manager.get_cachedir())

  1. 清除整个缓存文件

  2. 最后再次导入matplotlib

希望你也会发现它对我有用

P:S - 如果您愿意,您可以在此之后重新启动 jupyter/ide(可选)

None 以上对我有用。我不得不结合提供的解决方案。

我 运行 Jupyter 来自 PyCharmWindows 10 。这是我的解决方法。在执行这些步骤之前,通过 import matplotlib.font_manager:

导入字体管理器
  1. 查找字体目录=> matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf')
  2. 将你的字体文件(ttf.文件)放到那个目录下。
  3. 查找字体配置文件:matplotlib.matplotlib_fname()
  4. 编辑以设置字体类型:pdf.fonttype: 42 # Output Type 3 (Type3) or Type 42 (TrueType)
  5. 运行 PyCharm.
  6. 启动内核后,会生成缓存文件。清理 \matplotlib\__pycache__ 文件夹。
  7. 通过以下方式设置您要使用的字体:
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = ['Lin Libertine']
  1. 运行 生成绘图的代码。

如果重启内核,会生成缓存文件,需要再次删除。