本文介绍两种解决该问题的方法,第一种需要每次在代码中加些东西,第二种是修改配置文件,可一劳永逸。
第一种:以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()