绘制带误差分析的柱状图
1.检查原始数据
原始数据展示如下:
工况 | 工况1 | 工况2 | 工况3 | 工况4 | 工况5 |
---|---|---|---|---|---|
M | 89.37 | 86.05 | 92.95 | 87.44 | 73.56 |
DF-1 | 87.45 | 80.98 | 89.68 | 84.43 | 73.46 |
DF-2 | 86.00 | 81.54 | 89.68 | 84.43 | 73.46 |
UP | 85.30 | 85.23 | 87.59 | 86.64 | 64.32 |
△DF-1 | 1.91 | 5.07 | 3.26 | 3.00 | / |
△DF-2 | 3.37 | 4.51 | 3.26 | 3.00 | / |
△UP | 4.06 | 0.82 | 5.36 | 0.79 | / |
2.导入数据库
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签显示错误代码
plt.rcParams['axes.unicode_minus']=False # 显示负号
小提示:
pandas为python提供了高效的数据处理、数据清洗与整理的工具;
matplotlib是利用python实现的绘图套件;
numpy是一个运行速度非常快的数学库,可以对从数据库中检索出的数据进行高效的数值计算和分析。
3.导入文件数据
path=r'文件路径\数据.xlsx'
data=pd.read_excel(path,sheet_name='python数据',index_col=0).T
data
输出结果展示:
工况 | M | DF-1 | DF-2 | UP | △DF-1 | △DF-2 | △UP |
---|---|---|---|---|---|---|---|
工况1 | 89.365599 | 87.451556 | 85.996861 | 85.302768 | 1.914043 | 3.368738 | 4.062831 |
工况2 | 86.046684 | 80.975119 | 81.536831 | 85.230923 | 5.071565 | 4.509853 | 0.815761 |
工况3 | 92.947416 | 89.684997 | 89.684997 | 87.590565 | 3.262419 | 3.262419 | 5.356852 |
工况4 | 87.435423 | 84.432082 | 84.432082 | 86.640972 | 3.003341 | 3.003341 | 0.794451 |
工况5 | 73.557850 | 73.464974 | 73.464974 | 64.315733 | 0.001000 | 0.001000 | 0.001000 |
有没有发现这里输出的数据表格和原始数据做了转置,并且△DF-1,△DF-2和△UP的工况5数据发生了变化,解释一下:
1.数据展示代码中对原始数据表格做了转置,这里为了展示该功能,实际操作中要灵活处理;
2.原始数据中的“/”会报错,而且不能有空值,可以将0数据设置成0.0001这种无限小的数字。
4.绘图
width = 0.2 #设置柱子的宽度
labels=['工况1', '工况2', '工况3', '工况4', '工况5'] #设置x轴标签
#设置柱子的数据与误差线的数据,此处注意:不能有空值,否则报错,可以将0数据设置成0.0001这种无限小的数字
x=np.arange(len(labels))
bar1=data['M'].tolist()
bar1_err=[0,0,0,0,0]
bar2=data['DF-1'].tolist()
bar2_err=data['△DF-1'].tolist()
bar3=data['DF-2'].tolist()
bar3_err=data['△DF-2'].tolist()
bar4=data['UP'].tolist()
bar4_err=data['△UP'].tolist()
#绘图
fig,ax=plt.subplots()
p1=ax.bar(x-0.3, bar1, width,color='royalblue',yerr=bar1_err,alpha=0.5,label='M')
p2=ax.bar(x-0.1, bar2, width,color='grey',yerr=bar2_err,alpha=0.3,label='DF-1')
p3=ax.bar(x+0.1, bar3, width,color='royalblue',yerr=bar3_err,alpha=0.9,label='DF-2')
p4=ax.bar(x+0.3, bar4, width,color='grey', yerr=bar4_err,alpha=0.6, label='UP')
ax.set_xticks(x) #此处设置的x刻度个数与xlabel要一致,否则会报错
ax.set_xticklabels(labels)
ax.set_ylabel('声压级(dBA)',fontsize=10)
ax.tick_params(labelsize=10)
ax.legend(fontsize=10)
ax.axis([-0.5,4.5,50,100]) #设置x轴的显示范围
#ax.set_title('测试结果对比',fontsize=30)
#设置柱子的标签
k=[p1,p2,p3,p4]
for p in k:
for i in range(0,len(p)):
a=p[i].get_x()+p[i].get_width()/2 #设置标签的x坐标,此处为x位置+柱子的1/2宽度
b=p[i].get_height() #获取柱子的高度,设置标签的时候按照柱子高度比例来
ax.text(a,0.87*b,'{}'.format(int(round(b,0))),alpha=0.9,fontsize=9,ha='center',va='bottom')
#利用zip组合来设置误差的标签,此处设置误差标签时将不想显示的设置为空值
bar2_err[4]=np.nan
for t,q,w in zip(x-0.1,bar2,bar2_err):
ax.text(t,q+w*1.1,'%.1f'%w,alpha=0.9,ha='center',va='bottom',fontsize=9)
bar3_err[4]=np.nan
for t,q,w in zip(x+0.1,bar3,bar3_err):
ax.text(t,q+w*1.1,'%.1f'%w,alpha=0.9,ha='center',va='bottom',fontsize=9)
bar4_err[4]=np.nan
for t,q,w in zip(x+0.3,bar4,bar4_err):
ax.text(t,q+w*1.1,'%.1f'%w,alpha=0.9,ha='center',va='bottom',fontsize=9)
输出结果展示: