1 导读
类别比较型图表的数据一般包含数值型和类别型两种数据类型,比如在柱形图中,X轴为类别型数据,Y轴为数值型数据,采用位置+长度两种视觉元素。
类别型数据主要包括柱形图、条形图、雷达图、坡度图、词云图等,通常用来比较数据的规模。自此系列开始,更新matplotlib类别比较图的实现方式。
本节内容: (1)柱状图的绘制 (2)条形图的绘制
2 柱状图系列
2.1 单数据系列柱状图
matplotlib提供了bar函数绘制柱状图。语法:plt.bar(left, height, width, bottom, align, **kwargs)
参数解释:
left:每个柱左侧的x轴坐标
height:每个柱的高度
width:柱的宽度
bottom:柱的y轴起始坐标(一般不修改)
align:对齐方式,默认居中对齐(一般不修改)
以下是一个实例,有一组价格和对应的数值,绘制成柱状图,宽度为0.3
import matplotlib.pyplot as plt
import pandas as pd
#构造数据
mydata = pd.DataFrame({'类别': ['中等', '良好', '优秀', '理想'],
'价格': [4300, 3800, 3950, 3500]})
fig = plt.figure()
ax1 = fig.add_subplot(111)#绘制柱状图
ax1.bar(mydata['类别'], mydata['价格'], width = 0.3, align = 'center')
plt.show()
ax1 = fig.add_subplot(211)
ax1.bar(mydata['类别'], mydata['价格'], width = 0.3, align = 'center')
ax2 = fig.add_subplot(212)#颜色用青色,内部使用'/'填充
ax2.bar(mydata['类别'], mydata['价格'], width = 0.3, align = 'center', color = 'c', hatch = '/')
2.2 多数据系列柱状图
多系列柱状图绘制时,要考虑到重叠的情况。在上一系列的柱状图绘制之后,下一个柱状图的x轴要右移(左移)若干单位,否则会出现重叠,通常移动的长度是柱状图的宽度。
mydata = pd.DataFrame({'类别': ['中等', '良好', '优秀', '理想'],
'价格': [4300, 3800, 3950, 3500],
'打折价格': [4000, 3650, 3700, 3450]})#构建数据集,包括不同类别的原始价格和打折后的价格
fig = plt.figure()
ax1 = fig.add_subplot(111)
x = np.arange(4)
ax1.bar(x, mydata['价格'], width = 0.3, align = 'center', label = '原始价格')
#绘制第二系列柱状图要右移0.3(柱状图宽度)单位
ax1.bar(x + 0.3, mydata['打折价格'], width = 0.3, align = 'center', label = '打折价格')
ax1.set_xticks(x + 0.3/2, mydata['类别']) #设置x轴刻度,并用类别代替
ax1.legend(prop = {'family': 'simsun', 'size': 15}) #设置图例字体字号
plt.show()
2.3 堆积柱状图
在第一个柱状图的前提下,增加一个bottom参数即可实现向上堆积,示例代码如下:
ax1 = fig.add_subplot(111)
p1_mean = [25, 30, 17, 20, -15]
p2_mean = [18, 22, 35, 18, -20]
p1_std = [2, 3, 4, 1, 2] #p1系列方差
p2_std = [2, 5, 7, 8, 1] #p2系列方差
x_label = ['G1', 'G2', 'G3', 'G4', 'G5'] #x轴刻度标签
x = np.arange(5)
p1 = ax1.bar(x, p1_mean, 0.35, yerr = p1_std, label = 'P1' )
#第二个柱状图添加bottom参数,即可实现堆积
p2 = ax1.bar(x, p2_mean, 0.35, yerr = p2_std, label = 'P2', bottom = p1_mean) #现实柱状图的标签信息
ax1.set_xticks(x, x_label) #设置x轴刻度
ax1.axhline(0, color='grey', linewidth=0.8) #绘制平行于x轴参考线ax1.legend(prop = {'family': 'simsun', 'size': 15}) #设置图例字体样式
plt.show()
2.4 3D柱状图
3D柱状图用的并不是很多,它主要是用于一个系列对应多个数据可以使用,每个系列的每个数据都是一个柱状图。
fig = plt.figure(figsize = (6, 6))
ax1 = fig.add_subplot(projection='3d') #设置子图的样式为
3Dcolor = ['c', 'r', 'g', 'b'] #为4个系列分别设置颜色
y_ticks = [0, 1, 2, 3] #设置4系列代号
for c, k in zip(color, y_ticks): #遍历每个系列代号以及对应的颜色
x = np.arange(20) #每个系列的数量为20个
height = np.random.rand(20) #每个数量的高度
cs = [c] * len(x) #因为每个系列有20个,为每个设置颜色
#3D中bar语法为(x, y, z), 下面语句表示在系列k上绘制x和z,指定高度轴为y,透明度为80%
ax1.bar(x, height, zs = k, zdir='y', color = cs, alpha = 0.8)
ax1.set_xlabel('X')
ax1.set_ylabel('Y')
ax1.set_zlabel('Z')
plt.show()
3 条形图系列
条形图的语法和柱状图的语法类似,只需要将plt.bar改为plt.barh即可。
语法:plt.barh(y, width, height, left, align, **kwargs)
注意:bar中的bottom在barh中要改为left;bar中的x轴标签设置要改为y轴标签设置。
本例将前面几个例子组合在一起,代码中的bar改为barh,代码如下:
ax1 = fig.add_subplot(221)
ax1.barh(mydata['类别'], mydata['价格'], 0.3, align = 'center')
ax2 = fig.add_subplot(222)
ax2.barh(mydata['类别'], mydata['价格'], 0.3, align = 'center', hatch = '/')
ax3 = fig.add_subplot(223)
x = np.arange(4)
rect1 = ax3.barh(x, mydata['价格'], 0.3, align = 'center', label = '原始价格')
rect2 = ax3.barh(x + 0.3, mydata['打折价格'], 0.3, align = 'center', label = '打折价格')
ax4 = fig.add_subplot(224)
x = np.arange(5)
p1 = ax4.barh(x, p1_mean, 0.35, xerr = p1_std, label = 'P1' )
p2 = ax4.barh(x, p2_mean, 0.35, xerr = p2_std, label = 'P2', left = p1_mean)
ax4.set_yticks(x, x_label)
ax4.axvline(0, color='grey', linewidth=0.8) #绘制于y轴的直线
plt.show()
总结
本文总结了matplotlib类别比较图的概念,并实现了其中柱状图和条形图的代码,柱状图利用了bar语法,条形图利用了barh语法。
在文章最后,将前面的示例做了总结,并使用了多个子区来绘图,复习了多区域绘图方法,只有不断地复习前面的知识,才能更加快速理解和学习。
由于篇幅的限制,本篇到此结束,下一节将继续介绍matplotlib类别比较图的其他绘图语法。此内容将在"python数据可视化之美"公众号同步更新。如果您有更好的想法或对文章有其他建议,可以关注或评论留言。如果有想要了解其它的内容,也可以联系或评论,感谢您的阅读