繪製帶誤差分析的柱狀圖

海唤鱼發表於2024-07-11

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)    

輸出結果展示:

相關文章