1. 程式人生 > >解決Linux系統中python matplotlib畫圖的中文顯示問題

解決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

#生成字型索引資訊. 會顯示字型的font-family

sudo mkfontscale

sudo mkfontdir

#更新字型快取:

fc-cache

5. 修改matplotlibrc檔案

修改步驟1中獲取的matplotlibrc檔案配置。

將font.family 部分註釋去掉,並且在font.serif 支援字型加上一個中文字型。這裡就加上剛才下載的中文字型的font-family. 可以通過 fc-list 命令查詢一下(所以前面最好記下來)。我這裡增加的是"WenQuanYi Zen Hei Mono"字型。

下面這句註釋要去掉,不然中文減號也顯示方塊:

axes.unicode_minus : False

6. 這一步驟最重要!為matplotlib增加中文字型

完成步驟5後,再操作步驟2,會發現“可用的中文字型”已經有了剛才安裝的字型,但是畫圖仍然不能顯示中文。這是因為你這個字型給centos安裝了、也告訴matplotlib要用這個字型了,但是,matplotlib找不到這個字型的ttf檔案,所以需要將下載的ttf字型複製一份到以下路徑:

 /root/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf

並刪除相關cache。在以下路徑:

~/.cache/matplotlib

刪除其中與字型有關的cache 

7. 現在重新畫個圖試試