Python Matplotlib 中文字體或負數顯示亂碼、空格問題解決方法

在用 python 的 Matplotlib 來繪圖時,若需要顯示中文時,就會出現方格或亂碼的狀況。

系統環境:
Windows 10 Professional x64 21H2
python : 3.8.5.final.0
matplotlib : 3.3.2

1. 小編特別使用非 Windows 內建的字體,因為有些情況因企業需要特別的字體,我們到 Google Noto Fonts 來下載免費的思源黑體(Noto Sans CJK TC)與思源宋體(Noto Serif CJK TC),透過搜尋「Traditional Chinese」就可以找到。

2.將字體放到matplotlib的字體套件資料夾。可以使用下列語法找出字體放置的目錄位置和預設的字體是什麼,在把字體放進去該目錄。
 

3.matplotlib套件會在你第一次import時,將所有的快取設定存取在\.matplotlib資料夾中(在C:\Users\Admin\.matplotlib),裡面包含了可以使用字體的 fontList.json 檔案,需要將其刪除,並重新import matplotlib,才會重新搜尋到剛剛放進去的字體。

4.最後在程式碼加入以下的語法,加入你剛剛放入的字體:
plt.rcParams[‘font.family’] = ‘Noto Sans TC’
卻發現如下錯誤訊息:
C:\Users\Admin\anaconda3\lib\site-packages\matplotlib\font_manager.py:1241:
UserWarning: findfont: Font family [‘Noto Sans CJK TC’] not found.
Falling back to
DejaVu Sans.

5. 可能是 Matplotlib 沒有找到 fc-list 列出來的字體,所以可以用如下這個方式來查到底哪些字體是 Matplotlib 可用的 font family 。

6. 若你放入的字體沒找到,請重新將 Restart Kernel(以Jupyter notebook為例)。

7. 再次確認你放入的字體有出現即可。

8. 在重新載入字體並用matplotlib來繪圖,即可正常顯示!

9. 前面提到為何要另外使用非內建的字體,因為有些中文字體在碰到負號時,會無法正常顯示,尤其是內建的字體,如下圖使用的是微軟正黑體(Microsoft JhengHei)。當然若只能使用內建字體(常常因為版權的因素 …)又碰到這個問題時,可以加入以下的語法就可以解決。
plt.rcParams[‘axes.unicode_minus’]=False

打完收工,繼續努力。

 

 

發佈留言