系统:MacOS

事出有因

在jupyterlab中使用matplotlib画图,图的坐标轴中文字体不显示,且jupyter cell抛出缺失当前字体的警告。

Bug现场

1
2
3
4
5
6
UserWarning: Glyph 28857 (WICJK UNIFIED IDEOGRAPH-70B9) MISSING FROM CURRENT FONT
UserWarning: Glyph 36190 (INICJK UNJFIED IDEOGRAPH-80SEJ) MISSING FROM CURRENT FONT
UserWarning: Glyph 25968 (INICZK UNIFIED IDEOGRAPH-6570) MISSING FROM CURRENT FONT
UserWarning: Glyph 27983 (WNICJK UNIFIED IDEOGRAPH-604F) MISSING FROM CURRENT FONT
UserWarning: Glyph 35272 (VNICJK UNJFIED IDEOGRAPH-89C8) MISSING FROM CURRENT FONT
UserWarning: Glyph 37327 (WICJK UNIFIED IDEOGRAPH-91CF) MISSING FROM CURRENT FONT

迎刃而解

根因分析

根据错误堆栈信息可看出,matplotlib默认不自带中文字体,需要先下载中文字体,放到对应环境包的路径下。

实践求证

在虚拟环境中进入matplotlib包下查看:

1
2
3
4
5
6
7
8
9
(jupyter_py38env) ➜  fonts cd ttf
(jupyter_py38env) ➜ ttf pwd
/usr/local/Caskroom/miniforge/base/envs/jupyter_py38env/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf
(jupyter_py38env) ➜ ttf ls
DejaVuSans-Bold.ttf LICENSE_DEJAVU STIXSizOneSymReg.ttf
DejaVuSans-BoldOblique.ttf LICENSE_STIX STIXSizThreeSymBol.ttf
DejaVuSans-Oblique.ttf STIXGeneral.ttf STIXSizThreeSymReg.ttf
DejaVuSans.ttf STIXGeneralBol.ttf STIXSizTwoSymBol.ttf
...

确实没有找到中文字体。

解决方式

  1. 找到Mac中Python使用的字体库的位置
1
2
3
4
5
6
7
8
9
In [1]: import matplotlib

# 查找字体路径
In [2]: print(matplotlib.matplotlib_fname())
/usr/local/Caskroom/miniforge/base/envs/jupyter_py38env/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc

# 查看字体缓存路径
In [3]: print(matplotlib.get_cachedir())
/Users/roninsswang/.matplotlib
  1. 下载字体

常见中英文字体对照名称:

字体中文名称 English Name
新细明体 PMINGLIU
幼圆 YOUYUAN
华文细黑 STXIHEI
细明体 MINGLIU
华文楷体 STKAITI
标楷体 DFKAI-SB
华文宋体 STSONG
黑体 SIMHEI
宋体 SIMSUN
华文中宋 STZHONGSONG
华文仿宋 STFANGSONG
新宋体 NSIMSUN
方正舒体 FZSHUTI
仿宋 FANGSONG
方正姚体 FZYAOTI
楷体 KAITI
微软雅黑 MICROSOFT YAHEI

下载需要的字体,此处下载SimHei。

  1. 将下载的字体移动到matplotlib的字体库的位置
1
2
3
(jupyter_py38env) ➜  ttf pwd
/usr/local/Caskroom/miniforge/base/envs/jupyter_py38env/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf
# 将SimHei.ttf放入此目录
  1. 修改配置文件matplotlibrc

进入下列路径下:

1
2
(jupyter_py38env) ➜  mpl-data pwd
/usr/local/Caskroom/miniforge/base/envs/jupyter_py38env/lib/python3.8/site-packages/matplotlib/mpl-data

编辑 matplotlibrc 文件,修改以下配置:

1
font.sans-serif: SimHei, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
  1. 清除缓存
1
rm -rf /Users/roninsswang/.matplotlib
  1. 重启jupyterlab,再次运行,Bug解除。

本站由 sswfive 使用 Stellar 1.42.0 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站总访问量