如何为分组柱状图的橙色条形添加指定最值的误差线?
为分组柱状图指定条形添加自定义误差线(对数坐标轴)
问题背景
现有分组柱状图代码,其中橙色条形对应AGB数据的平均值,需要为这两个橙色条形分别添加自定义误差范围:
- SiC₂的误差范围:[3.7e-7, 3.7e-5]
- SiS的误差范围:[8.0e-7, 1.1e-5]
直接使用yerr=[y_errormin, y_errormax]会导致误差线显示异常,原因是Matplotlib的bar函数中,yerr参数需要的是相对于柱顶的误差幅度,而非绝对的上下限;再加上使用对数坐标轴,需要确保误差计算符合轴的显示逻辑。
解决方案
- 计算每个橙色柱顶到上下限的误差幅度:
- 下方误差:柱顶值 - 下限值
- 上方误差:上限值 - 柱顶值
- 将误差幅度整理为
(2, n)形状的数组(n为柱子数量),对应[下方误差数组, 上方误差数组] - 在
bar函数中传入yerr参数,并添加capsize参数让误差线显示帽线,提升可读性
修改后的完整代码
import matplotlib.pyplot as plt import numpy as np # Enter my SiC2 data sic2_AGB = np.array([3.7e-7, 1.1e-5, 1.9e-6, 1.0e-5, 9.7e-6, 4.0e-6, 6.8e-6, 6.6e-6, 1.0e-6, 1.3e-5, 6.0e-6, 3.7e-5, 1.7e-6, 4.2e-6, 2.7e-6, 1.4e-5, 1.0e-5, 8.8e-7, 3.6e-6, 2.0e-5, 1.6e-6, 6.0e-7, 2.7e-5, 3.0e-6, 4.0e-6]) sic2_g0693 = 7.9e-11 # Enter my SiS data sis_AGB = np.array([1.3e-6, 4.8e-6, 3.8e-6, 1.9e-6, 7.2e-6, 8.0e-7, 7.0e-6, 4.0e-6, 6.1e-7, 1.0e-5, 1.0e-5, 4.1e-6, 9.6e-7, 1.1e-5, 1.1e-6, 4.9e-6, 4.6e-6, 9.8e-7, 3.3e-6, 2.3e-6, 2.8e-6, 1.7e-6, 1.1e-5, 4.6e-6, 2.2e-6]) sis_g0693 = 3.9e-10 # Calculate the average of AGB data sic2_AGB_mean = np.mean(sic2_AGB) sis_AGB_mean = np.mean(sis_AGB) labels = ['SiC$_{2}$', 'SiS'] data_g0693 = [sic2_g0693, sis_g0693] data_AGB =[sic2_AGB_mean, sis_AGB_mean] # 自定义误差上下限 y_errormin = [3.7e-7, 8.0e-7] y_errormax = [3.7e-5, 1.1e-5] # 计算误差幅度:[柱顶-下限, 上限-柱顶] lower_errors = [data_AGB[i] - y_errormin[i] for i in range(len(data_AGB))] upper_errors = [y_errormax[i] - data_AGB[i] for i in range(len(data_AGB))] # 整理为Matplotlib要求的(2, n)形状 y_error = [lower_errors, upper_errors] x = np.arange(len(labels)) # the label locations width = 0.15 # width of the bar fig, ax = plt.subplots() ax.bar(x - width/2, data_g0693, width, label='G+0.693') # 添加误差线,capsize设置帽线长度 ax.bar(x + width/2, data_AGB, width, label='AGB', yerr=y_error, capsize=5) # Labels and axes plt.xticks(x, labels) plt.yscale('log', nonposy='clip') plt.ylabel('$\chi$', fontsize=15) plt.tick_params(axis='x', labelrotation=0, labelsize= 10) plt.tick_params(axis="y",direction="in") ax.legend() plt.tight_layout() plt.savefig('toto.jpg',bbox_inches='tight', dpi=150) plt.show()
关键说明
- Matplotlib的
bar函数中,yerr的正确格式是一个二维数组,第一行是每个柱子的下方误差(柱顶到下限的距离),第二行是上方误差(上限到柱顶的距离) capsize参数用于显示误差线的水平帽线,让误差范围更直观- 由于使用对数坐标轴,确保所有误差值为正数(下限小于柱顶,上限大于柱顶),避免显示异常
内容的提问来源于stack exchange,提问作者S. Mas
相关产品推荐
相关产品推荐

