Python 3下使用Matplotlib工具画图,中文显示乱码的问题解决(修改配置文件)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ccblogger/article/details/79613335

本文介绍两种解决该问题的方法,第一种需要每次在代码中加些东西,第二种是修改配置文件,可一劳永逸。

第一种:以Kaggle中的Titanic问题为例:

import matplotlib.pyplot as plt
fig = plt.figure()
fig.set(alpha=0.2)  # 设定图表颜色alpha参数

plt.subplot2grid((2,3),(0,0))             # 在一张大图里分列几个小图
data_train.Survived.value_counts().plot(kind='bar')# 柱状图 
plt.title(u"获救情况 (1为获救)") # 标题
plt.ylabel(u"人数")  

plt.subplot2grid((2,3),(0,1))
data_train.Pclass.value_counts().plot(kind="bar")
plt.ylabel(u"人数")
plt.title(u"乘客等级分布")

plt.subplot2grid((2,3),(0,2))
plt.scatter(data_train.Survived, data_train.Age)
plt.ylabel(u"年龄")                         # 设定纵坐标名称
plt.grid(b=True, which='major', axis='y') 
plt.title(u"按年龄看获救分布 (1为获救)")


plt.subplot2grid((2,3),(1,0), colspan=2)
data_train.Age[data_train.Pclass == 1].plot(kind='kde')   
data_train.Age[data_train.Pclass == 2].plot(kind='kde')
data_train.Age[data_train.Pclass == 3].plot(kind='kde')
plt.xlabel(u"年龄")# plots an axis lable
plt.ylabel(u"密度") 
plt.title(u"各等级的乘客年龄分布")
plt.legend((u'头等舱', u'2等舱',u'3等舱'),loc='best') # sets our legend for our graph.


plt.subplot2grid((2,3),(1,2))
data_train.Embarked.value_counts().plot(kind='bar')
plt.title(u"各登船口岸上船人数")
plt.ylabel(u"人数")  
plt.show()

运行结果:


乱码是Matplotlib缺少中文配置所导致的,所以我们只需要在程序中说明使用中文字体即可。

先选一个字体。在计算机中找到字体,选择一种中文字体,比如我这里用的是宋体


右键点击属性可以查看文件名称和路径:


解决方法:

1、设置自定义的中文文字(在程序中定义Matplotlib的字体管理

myfont = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')

2、在代码中中文出现的地方做一些修改,修改后代码如下:

import pandas as pd
import numpy as np
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
import  matplotlib
myfont = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')


data_train = pd.read_csv("E:/MLcompetition/kaggle/Titanic/Data/Train.csv")

fig = plt.figure()
fig.set(alpha=0.2)  # 设定图表颜色alpha参数

plt.subplot2grid((2,3),(0,0))             # 在一张大图里分列几个小图
data_train.Survived.value_counts().plot(kind='bar')# 柱状图
plt.title(u"获救情况 (1为获救)", fontproperties = myfont) # 标题
plt.ylabel(u"人数", fontproperties = myfont)

plt.subplot2grid((2,3),(0,1))
data_train.Pclass.value_counts().plot(kind="bar")
plt.ylabel(u"人数", fontproperties = myfont)
plt.title(u"乘客等级分布", fontproperties = myfont)

plt.subplot2grid((2,3),(0,2))
plt.scatter(data_train.Survived, data_train.Age)
plt.ylabel(u"年龄", fontproperties = myfont)                         # 设定纵坐标名称
plt.grid(b=True, which='major', axis='y')
plt.title(u"按年龄看获救分布 (1为获救)", fontproperties = myfont)


plt.subplot2grid((2,3),(1,0), colspan=2)
data_train.Age[data_train.Pclass == 1].plot(kind='kde')
data_train.Age[data_train.Pclass == 2].plot(kind='kde')
data_train.Age[data_train.Pclass == 3].plot(kind='kde')
plt.xlabel(u"年龄", fontproperties = myfont)# plots an axis lable
plt.ylabel(u"密度", fontproperties = myfont)
plt.title(u"各等级的乘客年龄分布", fontproperties = myfont)
plt.legend((u'头等舱', u'2等舱',u'3等舱'),loc='best', prop = myfont) # sets our legend for our graph.


plt.subplot2grid((2,3),(1,2))
data_train.Embarked.value_counts().plot(kind='bar')
plt.title(u"各登船口岸上船人数", fontproperties = myfont)
plt.ylabel(u"人数", fontproperties = myfont)
plt.show()


结果如图:


—————————————————————————————————————————————————————

第二种:

最近找到一种一劳永逸的方法,经测试有效,下面介绍具体方法:

import matplotlib
matplotlib.matplotlib_fname() #将会获得matplotlib包所在文件夹

然后进入C:\Anaconda64\Lib\site-packages\matplotlib\mpl-data该文件夹下就能看到matplotlibrc配置文件。(这里的路径是你的安装目录,视个人情况而定)

1)打开该配置文件,找到下面这两行:

#font.serif          : DejaVu Serif, Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
#font.sans-serif     : DejaVu Sans, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

然后将开头的两个注释符删掉。

#axes.unicode_minus  : True    # use unicode for the minus symbol

该处是为了能够使坐标轴上的负号正常显示,同样将开头的注释符#去掉,然后将True改为False:

axes.unicode_minus  : False    # use unicode for the minus symbol

2)找中文字体放到matplotlib字体库中。
在Windows文件夹下:C:\Windows\Fonts\复制该字体(例如此处我复制的为:楷体 常规(文件名为simkai.ttf。注意要看下字体的属性,须复制后缀名为ttf的)),然后粘贴到C:\Anaconda64\Lib\site-packages\matplotlib\mpl-data\fonts\ttf(这里依然是安装目录)文件夹。

注明:这一步的作用其实就是将matplotlib中一个默认的字体替换为我们复制过来的中文字体,将这个中文字体命名改为matplotlib中有的字体名。

3) 查看你的字体文件在fontManager中的注册的名字。

找到.matplotlib/cache里面的两个缓存字体文件

打开fontList.json,找到simkai.ttf(我们添加的楷体字体)所在位置:


可以看到我们的字体文件的注册名字为KaiTi。

4)将我们的字体文件的注册名字加到配置文件代码中sans-serif后面:

font.sans-serif     : KaiTi, DejaVu Sans, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

这样就解决了,测试一下:

import matplotlib
import matplotlib.pyplot as plt
plt.figure()
plt.title("六六六")
plt.show()

展开阅读全文

没有更多推荐了,返回首页