作者KSJ (阿真)
看板Python
标题Re: [问题] matplotlib显示中文的问题
时间Fri Apr 23 11:08:39 2021
回应这个考古题一下
关於matplotlib显示中文的问题
引言中与其推文的大大们都提供了不错的解法
主要包含 详细档案的设定 与 pip install 两种方式
之前我也是一直用prop fontproperties等等在制图中一个个去处理中文问题
非常不方便
最近我以研究与练习的角度完成了「matplotlib-taiwan-font」
来跟大家推广一下
用法上跟Hsins大大(本篇引文)几乎一样 但我只包了台北黑体
实作上没有想太多 只希望能秀出中文而已
目前的安装方式(要有git…)
pip install git+
https://gitlab.com/scku208/matplotlib-taiwan-font
如果想用
pip install mpltw
请跟我说 有一个人附议我就回忆一下上传pypi的方法(还是有志者愿意代劳?
(最)简易的使用范例
from mpltw import plt
plt.plot([1,2,3])
plt.title('直接用中文')
plt.show()
详细(其实也还好)
还请参考模组网址
https://gitlab.com/scku208/matplotlib-taiwan-font
本模组使用台湾制造的MIT LICENSE
欢迎直接拿去用(code其实只有10行左右...)
有任何安装或使用的问题 也欢迎任何方式的讨论
我要去画图啦~ 谢谢大家
※ 引述《Hsins (迅雷不及掩耳盗铃)》之铭言:
: tl;dr
: 长话短说,我弄了个套件只要 import 就能够将思源繁中字体的三个常见字重和
: cwTeX 开源字体设定好,额外设定也不难。
: https://github.com/Hsins/mpl-tc-fonts
: 有兴趣的可以慢慢看一下下面的内容,反正我礼拜一晚上追了一下,发现很多人
: 会随便乱设定跟书上乱讲是有情有可原的,并没有想像中容易。
: ----
: 上礼拜刚好有朋友又问到这个问题,索性就跑去看了一下 matplotlib 关於字体
: 设定部分的原始码。对整个 matplotlib 来说,字体渲染其实并不是一个那麽好
: 处理的部分,特别是当考虑到广大的中日韩字元(CJK characters)使用者的时
: 候...
: 多数人卡关的其实是关於 matplotlib 字体缓存的部分,说穿了其实就是套件本
: 身会持有一个 FontList 去管理已知可用的字体,并且在自己的资料夹下面保有
: 字体档的缓存,但这样其实并不是一个节省空间的作法(系统字体仓库有一份,
: 而我自己套件仓库下又多存一份),所以在 2.0.0版本之後提供了直接使用字体
: 档案路径,添加进 FontList 以便使用时查找。
: 不过这一个阶段又有人卡关了,因为必须提供字体档案的绝对路径,有一大部分
: 的使用者由於使用的作业系统有所不同,路径的表达方式也有所不同,这一个问
: 题在早期使用 os 套件库时会有些小问题,不过在 Python 3 之後提供了好用的
: pathlib 可以简单又优雅地处理路径在不同作业系统下表达方式不同的问题。
: 然而接下来又会撞到下一个关卡,就是设定 matplotlib 下绘图的字体设定,在
: 官方文件里面说:
: You can explicitly set which font family is picked up for a given
: font style (e.g., 'serif', 'sans-serif', or 'monospace').
: In the example below, we only allow one font family (Tahoma) for the
: sans-serif font style. The default family is set with the font.family
: rcparam, e.g.
: ```python
: rcParams['font.family'] = 'sans-serif'
: ```
: and for the font.family you set a list of font styles to try to find
: in order:
: ```python
: rcParams['font.sans-serif'] = ['Tahoma', 'DejaVu Sans',
: 'Lucida Grande', 'Verdana']
: ```
: 问题到了这里,其实并没有解决!在这里上面的 'font.family' 是告诉绘图的
: 套件我可以选用哪些字体族,比如此处只从 'sans-serif' 字体族去找字体,
: 於是我还必须在 'font.sans-serif' 字体族设定里面去添加我的中文字体才能
: 满足需求。
: 很多教学文章在这里就全部乱了套,这些文章东抄西抄大概也没有认真去看一下
: 问题到底在哪。比如把中文字体直接放在了 'font.family' 里面,又或者是没
: 有在 'font.family' 里面添加 'serif' 就把中文字体添加到 'font.serif' 中
: ,一点用处也没有。
: 然而即使把中文字体添加到上述的 'font.san-serif' 中了,问题也未必能够解
: 决!因为还有一个关卡就是在这个字体列表中的字体顺序。这边必须特别提出来
: 讲的原因就是 matplotlib 没有实作字体回退(font fallback) 的机制,然而
: 字体设定又给你一个列表,多数人会误以为这边的运作机制和浏览器中的字体设
: 定一样:
: https://webptt.com/cn.aspx?n=bbs/Web_Design/M.1279032453.A.80B.html
: 不不不!并不是这样的,在 matplotlib 的认知里面,这个字体列表并不是用来
: 「依序套用」字体的顺序列表,是拿来「依序寻找」字体的顺序列表,所以如果
: 字体列表中的第一个字体能够在他维护的 FontList 中找到并且路径有效,就会
: 用从头到尾都用这个字体,如果这个字体是拉丁字符集,那麽遇到中日韩字符自
: 然会变成方块(也就是俗称的豆腐)。有兴趣帮忙实作的可以追一下这个 issue
: :
: https://github.com/matplotlib/matplotlib/issues/18883
: 最後还请大家帮我测试一下有没有什麽大问题
: 虽然没什麽技术含量的一个 package....
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.120.190 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1619147323.A.B16.html
※ 编辑: KSJ (122.116.120.190 台湾), 04/23/2021 11:09:32
1F:推 taipoo: 好像不错,谢谢分享 04/23 11:29
2F:→ alvinlin: 不能直接去matplotlib告诉他们你们的套件在处理显示中文 04/23 12:10
3F:→ alvinlin: 上烂透了吗? 04/23 12:10
4F:推 Hsins: 实际上是因为他们的字体回退机制并不像网页那样,我有提 is 04/23 23:02
5F:→ Hsins: sue 但看起来并不是当前他们团队会处理的 04/23 23:02
7F:→ Hsins: 毕竟用免钱的,不用这麽凶去呛人吧… 04/23 23:03
8F:→ Hsins: 我自己是们心自问自己没时间也没办法独立尻出一个处理 CJK 04/23 23:06
9F:→ Hsins: 很优秀的绘图套件,或许觉得他们烂透的 2 楼可以试试 04/23 23:06
10F:→ Hsins: 如果要上 pypi 可能要先检查一下 package 大小,因为中文字 04/23 23:11
11F:→ Hsins: 体很肥,然後 pypi 有档案大小限制,如果太大的话要先推一 04/23 23:11
12F:→ Hsins: 板上去然後在 pypi 那边提 issue 请他们帮忙设定 04/23 23:11