原文链接:http://www.juzicode.com/data-visualize-matplotlib-config-show-chinese/
用matplotlib画图时默认情况下是不能正常显示中文的,我们先看一个简单的例子,这个例子希望在标题中显示“桔子code”:
import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__':
x = np.arange(-3,5)
y = x*x*x
plt.title("桔子code")
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x,y)
plt.show()
运行后可以看到在标题上的“桔子code”字符不能正常显示:
通常情况下通过matplotlib.matplotlib_fname()找到默认配置文件的位置:
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
'D:\\Python\\Python38\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc'
用记事本或者notepad++打开matplotlibrc文件,找到font.family,可以看到默认使用的是sans-serif:
将sans-serif修改为Youyuan或者Simsun等中文字体,并且去掉第一个字符“#”,就能在标题正常显示中文了:
font.family: YouYuan
#font.style: normal
#font.variant: normal
但是这种方法只能在本地电脑上“自娱自乐”,部署到其他电脑上时还需要手动修改配置文件,就显得不那么“优雅”了,下面再介绍下在代码中的修改方法。
第一种方法是修改pylot.rcParams属性,在画图前先设置中文字体,比如使用YouYuan(中文幼圆)字体:
if __name__ == '__main__':
plt.rcParams['font.family'] = ['YouYuan']
x = np.arange(-3,5)
y = x*x*x
plt.title("桔子code")
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x,y)
plt.show()
运行之后发现中文字体正常了,但是x轴和y轴上的负号显示不出来:
负号显示异常的问题可以通过配置axes.unicode_minus为False解决。
plt.rcParams['font.family'] = ['YouYuan']
plt.rcParams['axes.unicode_minus'] = False
第二种方法是使用pyplot.rc()方法在代码中修改配置
打开配置说明文件matplotlibrc,比如说要修改字体,查找font.family默认使用的字体是sans-serif,默认使用的大小是10.0:
可以这样修改:plt.rc()方法的第1个参数为‘font’,如果要修改font.size,传入入参size=‘15’,如果要修改font.family,传入入参family=’YouYuan’,注意都要用字符串形式。
plt.rc('font',family='YouYuan',size='15')
继续看下unicode_minus的配置,在matplotlibrc找到该配置:
plt.rc()方法的第1个参数为‘axes’,入参unicode_minus =’False’就能正常显示负号。
plt.rc('axes',unicode_minus='False')
完整的代码是这样的:
print('\n-----欢迎来到juzicode.com')
print('-----公众号: 桔子code/juzicode \n')
import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__':
plt.rc('font',family='Youyuan',size='15')
plt.rc('axes',unicode_minus='False')
x = np.arange(-3,5)
y = x*x*x
plt.title("桔子code")
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x,y)
plt.show()
继续看下axes的其他参数,比如修改边框的线宽axes.linewidth=‘5.0’,显示图片中的grid=‘True’:
import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__':
plt.rc('font',family='Youyuan',size='15')
plt.rc('axes',unicode_minus='False')
plt.rc('axes',linewidth='5.0',grid='True')
x = np.arange(-3,5)
y = x*x*x
plt.title("桔子code")
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x,y)
plt.show()
下图右侧是增大边框宽度和添加grid后的效果:
如果是要修改这种多层配置项:
#xtick.major.size: 3.5 # major tick size in points
#xtick.minor.size: 2 # minor tick size in points
可以这样修改,plt.rc()的第1个参数用前面两层的“xtick.major”,最后一层的size,width则是作为入参:
plt.rc('xtick.major',width='5',size='12')
附录~常用字体: 华文楷体:STKaiti 华文宋体:STSong 华文细黑:STHeiti Light [STXihei] 华文黑体:STHeiti 华文仿宋:STFangsong 苹果俪中黑:Apple LiGothic Medium 苹果俪细宋:Apple LiSung Light 俪黑 Pro:LiHei Pro Medium 俪宋 Pro:LiSong Pro Light 标楷体:BiauKai 微软正黑体:Microsoft JhengHei 微软雅黑体:Microsoft YaHei 仿宋_GB2312:FangSong_GB2312 楷体_GB2312:KaiTi_GB2312 标楷体:DFKai-SB 黑体:SimHei 宋体:SimSun 新宋体:NSimSun 新细明体:PMingLiU 细明体:MingLiU 仿宋:FangSong 楷体:KaiTi 隶书:LiSu 幼圆:YouYuan 华文彩云:STCaiyun 华文琥珀:STHupo 华文隶书:STLiti 华文行楷:STXingkai 华文新魏:STXinwei 华文细黑:STXihei 华文楷体:STKaiti 华文宋体:STSong 华文中宋:STZhongsong 华文仿宋:STFangsong 方正舒体:FZShuTi 方正姚体:FZYaoti