之前一段时间学校组织了数据分析的培训,虽然我没参加,但是考虑到我的专业和数据分析是比较相关的,且也有学习pandas
,numpy
,matplotlib
之类数据分析的想法,所以把上课的讲义下载下来自己学习了。
讲义是ipynb
格式,使用jupyter
好处也很多,比如持久化python环境(是这个叫法么)。
在学习第一课:可视化
时就遇到了困难,由于不想污染自己的计算机,或者说想分离开发环境,我在家里安置了一台服务器,用于远程vscode开发。在上边安装了arch系统和miniconda管理python环境。
起因
matplotlib默认包含字体只支持西文。由于老师默认系统为windows,所以为了支持中文,第一part代码(或者叫单元格?)的前两行代码为
1 | import matplotlib.pyplot as plt |
显而易见,这个字体在我的arch环境中是完全不存在的,这也导致在运行程序时报错
1 | findfont: Generic family 'sans-serif' not found because none of the following families were found: simHei |
我并不想指定字体文件来让程序主动加载字体,我认为没有必要,毕竟还要手动下载字体文件并放置。
安装字体
在Localization/Chinese - ArchWiki (archlinux.org)中可以查看arch可以安装那些字体。
在这里我选择使用sudo pacman -S wqy-zenhei
安装文泉驿正黑字体。
查看字体名称
使用fc-list :lang=zh
查看支持中文字体的字体名称,
1 | /usr/share/fonts/wenquanyi/wqy-zenhei/wqy-zenhei.ttc: WenQuanYi Zen Hei Mono,文泉驛等寬正黑,文泉驿等宽正黑:style=Regular |
我选择在matplotlib中使用的字体名称为WenQuanYi Zen Hei
需要注意的是,matplotlib报错提示缺失的字体族为sans-serif
,即无衬线字体。
所以实际上我不能选择WenQuanYi Zen Hei Mono
(等宽字体)和WenQuanYi Zen Hei Sharp
。(但是我也不确定,但是尝试这两个字体会报错)
刷新matplotlib的字体列表缓存
matplotlib在第一次启动时会搜索各文字文件所在路径,构建各文字文件的相关信息的缓存,在构建完缓存后安装的字体文件不会被matplotlib查找到,因此我们需要删除它的字体配置缓存。
使用以下python指令查询字体列表缓存目录
1 | import matplotlib as m |
或者直接 python -c "import matplotlib as m; print(m.get_cachedir())"
在这里我的输出为/home/xxx/.cache/matplotlib
。我们需要清空这个文件夹,使用rm /home/xxx/.cache/matplotlib/*
。实际上我这里只有一个文件
(可能需要)重启python环境
我这里使用了jupyter notebook,所以我需要重启jupyter kernel。
重启后再次运行示例,此时程序可以正常打印包含中文的图片。
成功
其他
matplotlib在3.1.0版本支持ttc字体文件加载
GitHub statistics for 3.1.0 (May 18, 2019) — Matplotlib 3.6.3 documentation
https://github.com/matplotlib/matplotlib/pull/9787/
很有用的博客
我们来解决一下 matplotlib 的中文显示问题 - 简书 (jianshu.com)
代码示例
1 | import matplotlib.pyplot as plt |