Matplotlib找不到基本字体

时间:2017-02-07 18:16:20

标签: python matplotlib true-type-fonts miniconda

我在miniconda虚拟环境中使用Python 3上的matplotlib版本2.0.0。我正在开发一个unix科学计算集群,我没有root权限。我通常通过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 /站点包/ matplotlib / MPL-数据/字体/ TTF /

其中只有40种字体:DejaVuSerif,DejaVuSans,STIX,cmb,cmt,cmy

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

13 个答案:

答案 0 :(得分:19)

这项工作对我来说::

$ sudo apt-get install msttcorefonts -qq

答案 1 :(得分:17)

我在运行Ubuntu Xenial 64位的Vagrant VM上遇到了同样的问题。无论我安装了多少字体,matplotlib都遇到了“系统”字体名称“sans-serif”的问题。我修理了它:

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

不再有关于sans-serif的错误消息。

答案 2 :(得分:10)

为了让它发挥作用,我不得不将两个当前的最佳答案结合起来。这对我有用:

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

答案 3 :(得分:5)

针对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等必要字体复制到此目录。

  4. 警告可能会持续存在,但您的情节字体应该会发生相应的变化。

答案 4 :(得分:3)

我实际上解决了

import matplotlib.font_manager

答案 5 :(得分:1)

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

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

locate -b '\mpl-data'

找到文件夹

/usr/share/matplotlib/mpl-data

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

rm -rf ~/.cache/matplotlib

重新启动jupyter笔记本,它就可以工作。

答案 6 :(得分:1)

我在使用 anaconda env 时遇到了这个问题(它在其他相关情况下也很有用)。 例如,对于 base 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'< /strong> 我使用了 plt.rcParams['font.family'] = 'DeJavu Serif'(“DeJavu 和 serif”之间有一个空格)。我为我工作。

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

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

我通过设置pyplot参数对其进行了修复:

import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'serif'

因此您可以使用如下字体(Helvetica,Times New Roman):

ax.set_title('your_title_text',fontname="Times New Roman", fontsize=20)

答案 9 :(得分:0)

我在使用jupyter笔记本电脑的macOS中,我通过以下方法解决了问题,首先关闭您的jupyter笔记本电脑。然后通过在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笔记本,一切都会很好。

答案 10 :(得分:0)

我花了好几个小时才终于确定我需要更新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

是我干了什么

答案 11 :(得分:0)

有一个conda程序包[1]。 因此,您真的不需要sudo来解决此问题!

conda install -c conda-forge -y mscorefonts

重新启动jupyter和/或强制重建matplotlib字体缓存

import matplotlib
matplotlib.font_manager._rebuild()

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

答案 12 :(得分:0)

Windows 用户

  1. 使用
  2. 直接进入matplotlib的缓存目录

将 matplotlib 导入为 mpl

打印(mpl.font_manager.get_cachedir())

  1. 清除整个缓存文件

  2. 最后再次导入 matplotlib

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

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