解決Linux系統中python matplotlib畫圖的中文顯示問題
執行環境:
- python3.7
- Linux Centos7
- 用conda安裝的matplotlib
問題:
- matplotlib畫圖,無法顯示中文
問題原因:
- linux作業系統以及matplotlib的字型庫中,沒有可用的中文字型
- matplotlib包預設只支援ASCII碼,不支援unicode碼
解決方案:
其實也是綜合了網上的各種解決方案。總體說來有以下幾個步驟:
1. 獲取matplotlibrc檔案所在路徑。我這裡使用遠端jupyter notebook獲取:
import matplotlib
matplotlib.matplotlib_fname()
例如,我的這個檔案在:
'/root/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc'
後續步驟會修改此檔案中的font引數。
2. 看看系統中的所有字型,以及可用的中文字型。也是在jupyter nb中:
from matplotlib.font_manager import FontManager import subprocess fm = FontManager() mat_fonts = set(f.name for f in fm.ttflist) print (mat_fonts) output = subprocess.check_output('fc-list :lang=zh -f "%{family}\n"', shell=True) print ('*' * 10, '系統可用的中文字型', '*' * 10) print (output) zh_fonts = set(f.split(',', 1)[0] for f in output.decode().split('\n')) available = mat_fonts & zh_fonts print ('*' * 10, '可用的字型', '*' * 10) for f in available: print(f)
做完上述操作,會發現“可用的字型”這裡為空。因為沒有中文字型給matplotlib用(所以才會中文都顯示“框框”)
3. 假設作業系統中沒有中文字型。此時下載一個ttf中文字型,並在cenos中安裝。要安裝那種系統能檢測font-family的,否則無效。我在這個網站下載的:http://font.chinaz.com/130130474870.htm
解壓rar檔案。在 /usr/share/fonts 路徑下建立存放此字型的資料夾myfonts,並下載的ttf檔案複製到myfonts中(可以給檔案改個英文名,方便操作)
4. 給cenos安裝這個字型。
先yum install -y fontconfig mkfontscale
然後
cd /usr/share/fonts/myfonts
|
5. 修改matplotlibrc檔案
修改步驟1中獲取的matplotlibrc檔案配置。
將font.family 部分註釋去掉,並且在font.serif 支援字型加上一個中文字型。這裡就加上剛才下載的中文字型的font-family. 可以通過 fc-list 命令查詢一下(所以前面最好記下來)。我這裡增加的是"WenQuanYi Zen Hei Mono"字型。
下面這句註釋要去掉,不然中文減號也顯示方塊:
|
6. 這一步驟最重要!為matplotlib增加中文字型
完成步驟5後,再操作步驟2,會發現“可用的中文字型”已經有了剛才安裝的字型,但是畫圖仍然不能顯示中文。這是因為你這個字型給centos安裝了、也告訴matplotlib要用這個字型了,但是,matplotlib找不到這個字型的ttf檔案,所以需要將下載的ttf字型複製一份到以下路徑:
/root/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf
並刪除相關cache。在以下路徑:
|
刪除其中與字型有關的cache
7. 現在重新畫個圖試試