在学习matplotlib画图过程中,难免会碰到x轴、y轴刻度、图标题、图例显示中文的情况。但是发现matplotlib默认不会显示中文,需要经过字体设置才可以。笔者在解决问题的过程中遇到了些小问题并成功解决了,希望能够帮助到大家。
此处选择绘制电影票房条形图作为案例讲解。
可以看到在x轴的刻度上本应该显示各个电影的名字,但是却都变成了方框。
解决这个问题的主要思路是:设置一个字体变量my_font,让路径是你电脑里的本地字体,然后在需要显示中文的代码中,单独将字体设置为这个字体变量my_font即可。
第一步,找到你电脑中的中文字体路径。
大多数电脑都存储在Fonts文件夹下,笔者电脑的字体保存在了c盘下,具体位置:C:\Windows\Fonts
假设我们想把中文字体设置为微软雅黑,就去找对象的字体 Microsoft YaHei UI。可以发现这里有3个字体,所以继续双击。
可以看到雅黑有3种字体,我们选择第一个常规即可。
需要注意的是,虽然字体是Microsoft YaHei UI 常规,但是字体路径名却不是这个。此时鼠标放在字体上鼠标右键点击属性。可以看到字体的命名是msyh.ttc
所以字体的路径是:
C:\Windows\Fonts\msyh.ttc
第二步,设置字体变量my_font
添加字体变量之前还需要导入font_manager
from matplotlib import font_manager
导入后,设置字体变量
my_font=font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
前面的代码已经敲好了,接下来就要找到需要显示中文的代码部分。
第三步,找到显示中文的代码,添加my_font属性
在最开始的结果图可以看到x轴的ticks需要显示中文。
将红框勾选的代码替换为:
# 设置字符串x轴
plt.xticks(range(len(a)),a,fontproperties=my_font,rotation=90)
中文就可以显示出来了。
接下来附上本次案例代码:
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5\n:最后的骑士","摔跤吧!爸爸","加勒比海盗5\n:死无对证","金刚:骷髅岛","极限特工\n:终极回归",
"生化危机6\n:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3\n:殊死一战","蜘蛛侠\n:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊"]
b = [56.01,26.94,17.53,16.49,15.15,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
# 设置图形大小
plt.figure(figsize=(14,30),dpi=80)
# 绘制条形图
plt.bar(range(len(a)),b,width=0.3)
# 设置字符串x轴
plt.xticks(range(len(a)),a,fontproperties=my_font,rotation=90)
plt.show()
# plt.savefig("./t6.png")
同时,这个案例有不足之处,再附上横向条形图的代码。
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归",
"生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊"]
b = [56.01,26.94,17.53,16.49,15.15,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
# 设置图形大小
plt.figure(figsize=(20,8),dpi=80)
# 绘制条形图
plt.barh(range(len(a)),b,height=0.3,color="orange")
# 设置字符串y轴
plt.yticks(range(len(a)),a,fontproperties=my_font)
plt.grid(alpha=0.3)
plt.show()
# plt.savefig("./t7.png")