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