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
相关产品推荐
相关产品推荐

