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

Matplotlib柱状图:如何将误差棒显示在置信区间边界而非中心

解决Matplotlib柱状图误差棒对齐柱子边界的问题

嘿,我懂你想要的效果——就是让误差棒的横向短条(cap)正好卡在柱子的左右边缘,而不是像现在这样飘在柱子中心对吧?看你的代码,问题出在xerr的取值上,咱们来改改就行!

问题根源

Matplotlib里plt.bar()的xerr参数,你现在传的是固定值0.1,这会让误差棒在柱子中心的左右各延伸0.1的距离,自然就和柱子边界对不上。而咱们要的是误差棒的端点正好落在柱子的左右边缘,这就需要把xerr设置成柱子宽度的一半。

修改后的完整代码

我给你调整了代码,加上了显式的柱子宽度设置,让误差棒完美对齐柱子边界:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(12345)
df = pd.DataFrame([np.random.normal(32000,200000,3650),
                   np.random.normal(43000,100000,3650),
                   np.random.normal(43500,140000,3650),
                   np.random.normal(48000,70000,3650)],
                  index=[1992,1993,1994,1995])
df1 = df.T
df1.columns = ['1992', '1993','1994','1995']

a = df1.describe()
means = a.loc['mean'].values.tolist()
stdevs = a.loc['std'].values.tolist()
counts = a.loc['count'].values.tolist()
index = np.arange(len(df1.columns))

CI = []
for i in range(len(means)):
    CIval = 1.96*stdevs[i]/(counts[i]**(0.5))
    CI.append(CIval)

plt.figure()
fig, ax = plt.subplots(figsize=(10,10))
ax.set_xticks(index)
ax.set_xticklabels(df1.columns)

# 显式设置柱子宽度,xerr取宽度的一半,让误差棒对齐柱子边缘
bar_width = 0.8  # Matplotlib默认柱子宽度就是0.8,这里显式写出来更清晰
plt.bar(index, means, width=bar_width, xerr=bar_width/2, yerr=CI, capsize=5)
plt.tight_layout()
plt.show()

核心调整说明

  • 我加了bar_width = 0.8,把默认的柱子宽度明确写出来,方便后续调整;
  • 把xerr改成bar_width/2,这样误差棒的左右端点就正好是柱子的左右边界,和你期望的图完全一致;
  • 额外加了capsize=5,让误差棒的短横线更突出,和示例图的风格更匹配。

跑一下修改后的代码,就能得到你想要的那种误差棒卡在柱子边缘的效果啦!

内容的提问来源于stack exchange,提问作者ZakS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:42:05