1.查看系统是否有可用的中文字体
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)
2.显示可用字体为无,则上传可用的中文字体
主要原因:linux系统以及matplotlib的字体库中,无可用的中文字体;matplotlib包默认只支持ASCII码,不支持unicode码
3.首先找到linux下matplotlib安装包下的字体文件库路径:
在Python中找到matplotlib的字体存放路径:
import matplotlib
matplotlib.matplotlib_fname()
运行的路径如下:
/root/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc
4.下载需要的字体
https://github.com/dolbydu/font(GitHub)
主要用到了SimHei.ttf这个字体,在GitHub的unicode中
将该字体上传到matplotlib字体存放路径下:/root/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/font/ttf
5.然后在代码中加入如下代码即可
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname="/root/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/SimHei.ttf"
plt.rfParams['font.sans-serif']=[SimHei]
然后还需要再 xlabel、ylabel、title中加入参数 fontproperties=font:
plt.title(title,fontproperties=font)
plt.xlabel(x_name,fontproperties=font)
plt.ylabel(y_name,fontproperties=font)
运行代码即可解决中文显示方框的问题。
另外如有横轴有中文刻度时,需要在此处加入参数:
plt.xticks(rotation=rotation,fontproperties=font)
若有使用图例,则需要在legend中加入参数prop为font:
plt.legend(prop=font)
词云图报错:OSError 图像显示为方框
解决方法:将wordcloud中参数font_path设置为如下即可:(当然前提是已做上面的步骤,该路径有该字体)
font_path = "/root/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/SimHei.ttf"