找回密码
 立即注册
首页 业界区 安全 绘制带误差分析的柱状图

绘制带误差分析的柱状图

何玲 昨天 09:30
1.检查原始数据

原始数据展示如下:
工况工况1工况2工况3工况4工况5M89.3786.0592.9587.4473.56DF-187.4580.9889.6884.4373.46DF-286.0081.5489.6884.4373.46UP85.3085.2387.5986.6464.32△DF-11.915.073.263.00/△DF-23.374.513.263.00/△UP4.060.825.360.79/2.导入数据库
  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. plt.rcParams['font.sans-serif']=['SimHei']   # 用来正常显示中文标签显示错误代码
  5. plt.rcParams['axes.unicode_minus']=False     # 显示负号
复制代码
小提示:
pandas为python提供了高效的数据处理、数据清洗与整理的工具;
matplotlib是利用python实现的绘图套件;
numpy是一个运行速度非常快的数学库,可以对从数据库中检索出的数据进行高效的数值计算和分析。
3.导入文件数据
  1. path=r'文件路径\数据.xlsx'
  2. data=pd.read_excel(path,sheet_name='python数据',index_col=0).T
  3. 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.绘图
  1. width = 0.2   #设置柱子的宽度
  2. labels=['工况1', '工况2', '工况3', '工况4', '工况5'] #设置x轴标签
  3. #设置柱子的数据与误差线的数据,此处注意:不能有空值,否则报错,可以将0数据设置成0.0001这种无限小的数字
  4. x=np.arange(len(labels))
  5. bar1=data['M'].tolist()
  6. bar1_err=[0,0,0,0,0]
  7. bar2=data['DF-1'].tolist()
  8. bar2_err=data['△DF-1'].tolist()
  9. bar3=data['DF-2'].tolist()
  10. bar3_err=data['△DF-2'].tolist()
  11. bar4=data['UP'].tolist()
  12. bar4_err=data['△UP'].tolist()
  13. #绘图
  14. fig,ax=plt.subplots()
  15. p1=ax.bar(x-0.3, bar1, width,color='royalblue',yerr=bar1_err,alpha=0.5,label='M')
  16. p2=ax.bar(x-0.1, bar2, width,color='grey',yerr=bar2_err,alpha=0.3,label='DF-1')
  17. p3=ax.bar(x+0.1, bar3, width,color='royalblue',yerr=bar3_err,alpha=0.9,label='DF-2')
  18. p4=ax.bar(x+0.3, bar4, width,color='grey', yerr=bar4_err,alpha=0.6, label='UP')
  19. ax.set_xticks(x)   #此处设置的x刻度个数与xlabel要一致,否则会报错
  20. ax.set_xticklabels(labels)
  21. ax.set_ylabel('声压级(dBA)',fontsize=10)
  22. ax.tick_params(labelsize=10)
  23. ax.legend(fontsize=10)
  24. ax.axis([-0.5,4.5,50,100]) #设置x轴的显示范围
  25. #ax.set_title('测试结果对比',fontsize=30)
  26. #设置柱子的标签
  27. k=[p1,p2,p3,p4]
  28. for p in k:
  29.     for i in range(0,len(p)):
  30.         a=p[i].get_x()+p[i].get_width()/2  #设置标签的x坐标,此处为x位置+柱子的1/2宽度
  31.         b=p[i].get_height()  #获取柱子的高度,设置标签的时候按照柱子高度比例来
  32.         ax.text(a,0.87*b,'{}'.format(int(round(b,0))),alpha=0.9,fontsize=9,ha='center',va='bottom')
  33.         
  34. #利用zip组合来设置误差的标签,此处设置误差标签时将不想显示的设置为空值
  35. bar2_err[4]=np.nan  
  36. for t,q,w in zip(x-0.1,bar2,bar2_err):
  37.     ax.text(t,q+w*1.1,'%.1f'%w,alpha=0.9,ha='center',va='bottom',fontsize=9)
  38.    
  39. bar3_err[4]=np.nan
  40. for t,q,w in zip(x+0.1,bar3,bar3_err):  
  41.     ax.text(t,q+w*1.1,'%.1f'%w,alpha=0.9,ha='center',va='bottom',fontsize=9)
  42.    
  43. bar4_err[4]=np.nan
  44. for t,q,w in zip(x+0.3,bar4,bar4_err):  
  45.     ax.text(t,q+w*1.1,'%.1f'%w,alpha=0.9,ha='center',va='bottom',fontsize=9)   
复制代码
输出结果展示:
1.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册