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]))
删除matplotlib缓存中的字体。
缓存位置:import matplotlib as mpl; print(mpl.font_manager.get_cachedir())
找到matplotlib的字体目录。该路径可能类似于
C:\Miniconda3\pkgs\matplotlib-2.2.2-py36_1\Lib\site-packages\matplotlib\mpl-data\fonts\ttf
复制必要的字体如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()
我在使用 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 用户
- 使用
进入matplotlib的缓存目录即可
将 matplotlib 导入为 mpl
打印(mpl.font_manager.get_cachedir())
清除整个缓存文件
最后再次导入matplotlib
希望你也会发现它对我有用
P:S - 如果您愿意,您可以在此之后重新启动 jupyter/ide(可选)
None 以上对我有用。我不得不结合提供的解决方案。
我 运行 Jupyter 来自 PyCharm 在 Windows 10 。这是我的解决方法。在执行这些步骤之前,通过 import matplotlib.font_manager
:
导入字体管理器
- 查找字体目录=>
matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf')
- 将你的字体文件(ttf.文件)放到那个目录下。
- 查找字体配置文件:
matplotlib.matplotlib_fname()
- 编辑以设置字体类型:
pdf.fonttype: 42 # Output Type 3 (Type3) or Type 42 (TrueType)
- 运行 PyCharm.
- 启动内核后,会生成缓存文件。清理
\matplotlib\__pycache__
文件夹。
- 通过以下方式设置您要使用的字体:
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = ['Lin Libertine']
- 运行 生成绘图的代码。
如果重启内核,会生成缓存文件,需要再次删除。
我在 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]))
删除matplotlib缓存中的字体。
缓存位置:import matplotlib as mpl; print(mpl.font_manager.get_cachedir())
找到matplotlib的字体目录。该路径可能类似于
C:\Miniconda3\pkgs\matplotlib-2.2.2-py36_1\Lib\site-packages\matplotlib\mpl-data\fonts\ttf
复制必要的字体如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
上使用 condalocate -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()
我在使用 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 用户
- 使用 进入matplotlib的缓存目录即可
将 matplotlib 导入为 mpl
打印(mpl.font_manager.get_cachedir())
清除整个缓存文件
最后再次导入matplotlib
希望你也会发现它对我有用
P:S - 如果您愿意,您可以在此之后重新启动 jupyter/ide(可选)
None 以上对我有用。我不得不结合提供的解决方案。
我 运行 Jupyter 来自 PyCharm 在 Windows 10 。这是我的解决方法。在执行这些步骤之前,通过 import matplotlib.font_manager
:
- 查找字体目录=>
matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf')
- 将你的字体文件(ttf.文件)放到那个目录下。
- 查找字体配置文件:
matplotlib.matplotlib_fname()
- 编辑以设置字体类型:
pdf.fonttype: 42 # Output Type 3 (Type3) or Type 42 (TrueType)
- 运行 PyCharm.
- 启动内核后,会生成缓存文件。清理
\matplotlib\__pycache__
文件夹。 - 通过以下方式设置您要使用的字体:
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = ['Lin Libertine']
- 运行 生成绘图的代码。
如果重启内核,会生成缓存文件,需要再次删除。