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. ...
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)
輸出結果展示: