本文主要介绍matplotlib的类别比较图,主要介绍了柱状图和条形图。
一、柱状图系列
1、单数据系列柱状图
matplotlib提供了bar函数绘制柱状图。语法:plt.bar(left, height, width, bottom, align, **kwargs)
解释:
left:每个柱左侧的x轴坐标
height:每个柱的高度
width:柱的宽度
bottom:柱的y轴起始坐标(一般不修改)
align:对齐方式,默认居中对齐(一般不修改)
import matplotlib.pyplot as plt
import matplotlib as mpl
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')
#设置xy轴的刻度字体样式,大小
x1_label = ax1.get_xticklabels()
[label.set_fontname('simsun') for label in x1_label ]
[label.set_fontsize(15) for label in x1_label]
y1_label = ax1.get_yticklabels()
[label.set_fontsize(15) for label in y1_label]
plt.show()
另外的,还有参数:color(控制颜色),hatch(控制填充)。
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、多系列柱状图
多系列柱状图绘制时,要考虑到重叠的情况。在上一系列的柱状图绘制之后,下一个柱状图的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()
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' )
#第二个柱状图底部以第一个柱状图的高度为基准,且两个柱状图都增加了方差,yerr表示系列方差
p2 = ax1.bar(x, p2_mean, 0.35, yerr = p2_std, label = 'P2', bottom = p1_mean)
#现实柱状图的标签信息
ax1.bar_label(p1, label_type = 'center', fontsize = 14, fontproperties = 'Times New Roman')
ax1.bar_label(p2, label_type = 'center', fontsize = 14, fontproperties = 'Times New Roman')
ax1.bar_label(p2, fontsize = 14, fontproperties = 'Times New Roman')
ax1.set_xticks(x, x_label)
ax1.axhline(0, color='grey', linewidth=0.8) #绘制平行于x轴参考线
ax1.legend(prop = {'family': 'simsun', 'size': 15}) #设置图例字体样式
plt.show()
4、3D柱状图
3D柱状图用的并不是很多,它主要是用于一个系列对应多个数据可以使用,每个系列的每个数据都是一个柱状图。
fig = plt.figure(figsize = (6, 6))
ax1 = fig.add_subplot(projection='3d') #设置子图的样式为3D
color = ['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个,为每个设置颜色
#在系列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()
二、条形图系列
条形图的语法和柱状图的语法类似,只需要将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')
y1_label = ax1.get_yticklabels()
[label.set_fontname('simsun') for label in y1_label ]
[label.set_fontsize(15) for label in y1_label ]
ax2 = fig.add_subplot(222)
ax2.barh(mydata['类别'], mydata['价格'], 0.3, align = 'center', hatch = '/')
y1_label = ax2.get_yticklabels()
[label.set_fontname('simsun') for label in y1_label ]
[label.set_fontsize(15) for label in y1_label ]
ax3 = fig.add_subplot(223)
x = np.arange(4)
rect1 = ax3.barh(x, mydata['价格'], 0.3, align = 'center', label = '原始价格')
ax3.bar_label(rect1, padding=3)
rect2 = ax3.barh(x + 0.3, mydata['打折价格'], 0.3, align = 'center', label = '打折价格')
ax3.legend(prop = {'family': 'simsun', })
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.bar_label(p1, label_type = 'center', fontsize = 14, fontproperties = 'Times New Roman')
ax4.bar_label(p2, label_type = 'center', fontsize = 14, fontproperties = 'Times New Roman')
ax4.bar_label(p2, fontsize = 14, fontproperties = 'Times New Roman')
ax4.set_yticks(x, x_label)
ax4.axvline(0, color='grey', linewidth=0.8) #绘制于y轴的直线
ax4.legend(prop = {'family': 'simsun', 'size': 15}, loc = 3)
plt.show()
本篇文章到此结束,感谢阅读!
本文分享自 python数据可视化之美 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!