绘制带误差分析的柱状图

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)    

输出结果展示:

热门相关:万里情深不负   清末四大奇案1986粤语   自古红楼出才子   梁医生又在偷偷套路我   傲世武皇