永久解決 matplotlib 圖例中文方塊錯誤

Galois發表於2020-03-15

問題

當列印圖例的時候,圖可以正常顯示,但中文會顯示方塊。比如title。然後會有個小報錯:
報錯描述:

/Users/username/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py: 1331: UserWarning: findfont: Font family [‘SimHei’] not found. Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))

檢視當前環境的字型路徑

import matplotlib
print(matplotlib.matplotlib_fname())

於是我就去看了下 /Users/username/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py 這個檔案,我是 Mac,Windows 的 matplotlib 路徑根據錯誤提示也能找到。

解決方法

首先下載一個字型檔案 SimHei.ttf
解壓字型後複製到 matplotlib/mpl-data/fonts目錄下面。

$ mv ~/Downloads/SimHei.ttf ~/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/

修改配置檔案 matplotlibrc

$ subl ~/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc

subl 是我之前配置的 sublime 的快捷命令。

found 這三項配置並修改:

font.family: sans-serif

font.sans-serif: SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

axes.unicode_minus: False # 解決負號'-'顯示為方塊的問題

前兩項大概在 194 行,第三項大概在 325 行。

但是改了配置之後並不會生效,需要重新載入字型,在 Python 中執行如下程式碼即可:

from matplotlib.font_manager import _rebuild
_rebuild() # reload一下

現在再列印圖例一點問題都沒有了,支援中英文混搭。

再次碰到問題,這次試一下刪除字型快取路徑,重啟編輯器。

字型快取路徑

import matplotlib
print(matplotlib.get_cachedir())

刪除快取

$ rm -rf ~/.matplotlib
本作品採用《CC 協議》,轉載必須註明作者和本文連結
不要試圖用百米衝刺的方法完成馬拉松比賽。

相關文章