matplotlib中文乱码问题

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())

显示效果如下:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值