matplotlib中文乱码问题
一、通常情况下乱码问题
可以使用matplotlib设置参数解决
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.rcParams['axes.unicode_minus']=False. #解决符号显示问题
一般情况下这个都能解决问题,但是当系统上没有这些字体时,上述的代码就不能正常工作了。不过不用着急,我们还有解决方法。
二、解决系统缺失字体库
另外一种情况是系统缺少字体集,matplotlib不能调用系统字体集。以ubuntu为例。
运行环境:
python3.7
ubuntu19
问题原因
linux操作系统及matplotlib的字体库中,没有可使用的字体
matplotlib包默认支持ASCII 码,不支持unicode码。
解决方法
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.decode('utf-8'))
########################python字符串前加u、r,b的含义###############################
#(1)u'我是含有中文字符组成的字符串' 作用:后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。
#(2)字符串前加 r 例:r"\n\n\n\n” # 表示一个普通生字符串 \n\n\n\n,而不表示换行了。(特殊字符:即那些,反斜杠加上对应字母,表示对应的特殊含义的,比如最常见的”\n”表示换行,”\t”表示Tab等。 )应用:常用于正则表达式,对应着re模块。
#(3) b" "前缀表示:后面字符串是bytes 类型。用处:网络编程中,服务器和浏览器只认bytes 类型数据。如:send 函数的参数和 recv 函数的返回值都是 bytes 类型 附:在 Python3 中,bytes 和 str 的互相转换方式是str.encode('utf-8') bytes.decode('utf-8')
###########################################################
zh_fonts = set(f.split(',', 1)[-1] for f in output.decode('utf-8').split('\n'))
available = mat_fonts & zh_fonts
print ('*' * 10, '可用的字体', '*' * 10)
for f in available:
print (f)
1.1 安装系统字体集
在终端使用 fc-list :lang=zh
如果没有出现自己需要的字体集,那么需要安装系统字体集,安装顺序如下:
下载字体集参考序列:
如果系统中没有可用的字体集,需要以下安装可以从
http://www.downcc.com/font/13528.html下载。
包含常用的黑体,微软雅黑等题字。
打开ubuntu的终端,输入
#解压字体集后,进入解压文件含有*.ttf文件的文件夹内
sudo mkdir /usr/share/fonts/myfonts
#选择需要的字体集复制到新建的文件夹中,例如:
cp ./仿宋_GB2312.ttf /usr/share/fonts/myfonts
#修改字体的权限
sudo chmod 664 /usr/share/fonts/myfonts/*.ttf
#进入myfonts新建文件夹中
cd /usr/share/fonts/myfonts/
#使用下面命令
sudo mkfontscale #若报错,按照提示安装相应的包
sudo mkfontdir #建立索引
sudo fc-cache #加入缓存,即可使用系统的字体集
1.2 字体集安装后,发现python中还是使用不了,需要配置matplotlib
python中输入下面命令
import matplotlib
print(matplotlib.matplotlib_fname())#获得python中matplotlib字体集的配置路径
我的路径是:/home/haosu/PycharmProjects/test/venv/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc
对上面的文件进行配置,
把上面的字体集*.ttf 文件复制到/home/haosu/PycharmProjects/test/venv/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/tff中。
即可使用了。
三、直接python使用tff字体库
但是有时候我们使用系统字体库不足,系统的权限又不足,不能安装新字体库。这时我们可以这样。我们准备一些字体库使用下列这些代码实现解决汉字乱码问题。
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
myfont=fm.FontProperties(fname='/data/user_data/haosu09/msyh.ttf')
plt.rcParams['axes.unicode_minus'] = False
plt.axis([0,5,0,20])
plt.title('我的中文图表',fontsize=20,fontname='幼圆',fontproperties=myfont)
plt.xlabel('计数',fontproperties=myfont) #给固定的点加文本
plt.ylabel('平方值',fontproperties=myfont)
plt.text(1,1.5,"一",fontproperties=myfont)
plt.text(2,4.5,"二",fontproperties=myfont)
plt.text(3,9.5,"三",fontproperties=myfont)
plt.text(4,16.5,"四",fontproperties=myfont)
plt.legend(['图例'],prop=myfont)
plt.plot([1,2,3,4],[1,4,9,16],'co') #(x y)
print(plt.show())
显示效果如下: