69

我在 miniconda 虚拟环境中的 Python 3 上使用 matplotlib 2.0.0 版。我正在开发一个没有 root 权限的 unix 科学计算集群。我通常通过 ipython notebook 执行 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

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

4

13 回答 13

51

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

$ sudo apt install msttcorefonts -qq
$ rm ~/.cache/matplotlib -rf
于 2018-04-17T17:21:01.367 回答
31

我在运行 Ubuntu Xenial 64 位的 Vagrant VM 上遇到了同样的问题。无论我已经安装了多少字体,matplotlib 的“系统”字体名称“sans-serif”都有问题。我通过以下方式修复了它:

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

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

于 2017-03-21T19:39:14.383 回答
25

这对我有用::

$ sudo apt-get install msttcorefonts -qq
于 2017-03-16T17:56:50.743 回答
15

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 )复制到此目录。

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

于 2018-04-03T16:27:54.163 回答
7

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

conda install -c conda-forge -y mscorefonts

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

另外,如果你不想重启 jupyter,你可以强制重建 matplotlib 字体缓存

import matplotlib
matplotlib.font_manager._rebuild()

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

于 2020-06-30T05:54:57.630 回答
7

我实际上解决了

import matplotlib.font_manager

于 2020-02-02T17:02:30.307 回答
4

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

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

import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'DeJavu Serif'
plt.rcParams['font.serif'] = ['Times New Roman']
于 2021-03-03T18:00:29.097 回答
3

我花了好几个小时才最终弄清楚我需要更新 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

是为我做的。

于 2019-10-10T14:32:19.090 回答
1

尝试以上所有方法,对我不起作用。

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

locate -b '\mpl-data'

找到一个文件夹

/usr/share/matplotlib/mpl-data

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

rm -rf ~/.cache/matplotlib

重新启动 jupyter notebook,它就可以工作了。

于 2018-12-06T05:52:36.937 回答
1

我在 gcloud VM 上运行的 Cloud Datalab docker 映像中遇到了类似的问题。执行以下操作为我解决了这个问题:

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

以下是有关如何访问在包含 Datalab 实例的 gcloud VM 上运行的 docker 映像的说明,以防万一。

于 2018-10-08T19:07:18.733 回答
0

对于 Windows 用户

  1. 只需通过使用转到 matplotlib 的缓存目录

将 matplotlib 导入为 mpl

打印(mpl.font_manager.get_cachedir())

  1. 清除整个缓存文件

  2. 最后再次导入 matplotlib

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

P:S - 如果您希望可以在此之后重新启动您的 jupyter/ide(可选)

于 2021-04-06T11:11:22.747 回答
0

我在 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,并将其复制到上面目录fonts/ttf下的mpl-data/目录中。

删除目录~/.cache/matplotlib并重新启动你的 jupyter notebook,一切都应该很好。

于 2019-10-06T01:39:02.470 回答
0

以上都不适合我。我必须结合提供的解决方案。

我在Windows 10中从PyCharm运行Jupyter。这是我的解决方法。在执行这些步骤之前,请通过以下方式导入字体管理器: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. 运行代码以生成绘图。

如果重新启动内核,如果会生成缓存文件,因此您需要再次删除它们。

于 2022-03-04T19:04:37.683 回答