核心概念:
- 支援中文其實就是想辦法讓系統支援 CJK 字型;所以本質上是「換字型」的方法。用 "customized font" 當關鍵字下去找,會比「中文 支援 matplotlib」的資料豐富。
- 想辦法讓 matplotlib 有對應的 CJK 字型、並且在畫圖的時候找得到那些字型
- matplotlib 可以說是 seaborn 的底層元件
所以實做上會是:
- 確認系統某處有中文字型,或是怎麼準備需要的字型檔案。
- matplotlib 吃 ttf
- 指令 fc-list :lang=zh or fc-cache -fv
- 搞清楚 matplotlib 要讀的字型要放哪裡
- 搞清楚 matplotlib 可以怎麼讀
- 討清楚 matplotlib 讀到的字型,可能是怎麼傳遞給 seaborn
查看系統中字型
查看字型(限 zh)
fc-list :lang=zh
查看字型快取
fc-cache -fv
查看 matplotlib 讀得到的字型
from matplotlib.font_manager import FontManager
import subprocess
fm = FontManager()
mat_fonts = set(f.name for f in fm.ttflist)
可以參考這個 gist
存放 matplotlib 讀得到的字型的地方
/usr/share/fonts/truetype/arphic
或是
site-packages/matplotlib/mpl-data/fonts/ttf
因為吃 ttf,而現在很多字型已經是 ttc 這種格式(把好幾個 ttf 打包起來),所以可以將系統中的中文字型抽出來放進上述目錄裡。這支小程式可以幫忙做這種轉檔
讓 matplotlib 開始讀字型
注意,每一次的新增刪減字型,都要把快取移除,新的狀態才會生效
rm -fr ~/.cache/matplotlib
每一次使用的時候決定要使用的字型
new_fonts = ['AR PL UKai TW'] + mpl.rcParams['font.sans-serif']
mpl.rcParams['font.sans-serif'] = new_fonts
或是可以調整 site-packages/matplotlib/mpl-data/matplotlibrc 來選定每次的預設字型(沒有好好試過)
seaborn 上的字型
對 seaborn 操作後,matplotlib 字型設定會回到預設值。要再調整過。
Ref:
https://newtoypia.blogspot.com/2018/08/matplotlib-ttc.html
https://scentellegher.github.io/visualization/2018/05/02/custom-fonts-matplotlib.html
https://monkey0105.github.io/2016/10/10/matplotlib-chinese-display/
https://medium.com/@aitmr1234567890/%E8%A7%A3%E6%B1%BApython-3-matplotlib%E8%88%87seaborn%E8%A6%96%E8%A6%BA%E5%8C%96%E5%A5%97%E4%BB%B6%E4%B8%AD%E6%96%87%E9%A1%AF%E7%A4%BA%E5%95%8F%E9%A1%8C-f7b3773a889b