数据可视化~matplotlib默认配置修改(可解决中文、负号等显示问题)

原文链接:http://www.juzicode.com/archives/2421

用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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注