Jupyter matplotlib画图中文字体缺失
系统: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 ...
确实没有找到中文字体。
解决方式
找到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
下载字体
常见中英文字体对照名称:
下载需要的字体,此处下载SimHei。
将下载的字体移动到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
修改配置文件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 rm -rf /Users/roninsswang/.matplotlib
重启jupyterlab,再次运行,Bug解除。