You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为分组柱状图的橙色条形添加指定最值的误差线?

为分组柱状图指定条形添加自定义误差线(对数坐标轴)

问题背景

现有分组柱状图代码,其中橙色条形对应AGB数据的平均值,需要为这两个橙色条形分别添加自定义误差范围:

  • SiC₂的误差范围:[3.7e-7, 3.7e-5]
  • SiS的误差范围:[8.0e-7, 1.1e-5]

直接使用yerr=[y_errormin, y_errormax]会导致误差线显示异常,原因是Matplotlib的bar函数中,yerr参数需要的是相对于柱顶的误差幅度,而非绝对的上下限;再加上使用对数坐标轴,需要确保误差计算符合轴的显示逻辑。

解决方案

  1. 计算每个橙色柱顶到上下限的误差幅度:
    • 下方误差:柱顶值 - 下限值
    • 上方误差:上限值 - 柱顶值
  2. 将误差幅度整理为(2, n)形状的数组(n为柱子数量),对应[下方误差数组, 上方误差数组]
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:35:24