在Matplotlib中为误差棒图设置自定义置信区间的问题
自定义置信区间绘制误差棒图的问题与解决方法
数据集
import pandas as pd mydf = pd.DataFrame({'Feature':['Pysch','Physio'],'log_or':[0.3126,0.2022],'se':[0.0712,0.0568], 'conf_low':[0.1729,0.0907], 'conf_high':[0.4522, 0.3136]}) mydf = mydf.sort_values(by='log_or') # 排序后的数据: # Feature log_or se conf_low conf_high # 1 Physio 0.2022 0.0568 0.0907 0.3136 # 0 Pysch 0.3126 0.0712 0.1729 0.4522
问题分析
用se设置xerr的错误原因
matplotlib的xerr/yerr参数直接传入标准误(se)时,会默认绘制对称误差区间(即log_or ± se*1.96,对应95%置信区间),但你已经有预计算好的conf_low和conf_high,即使数值接近,也会和预计算区间存在细微差异,导致结果不符合预期。
自定义区间代码出错的常见原因
很多人直接将[conf_low, conf_high]传入xerr,这是错误的:matplotlib要求不对称误差传入2×N的数组,第一行是均值到下界的差值(log_or - conf_low),第二行是上界到均值的差值(conf_high - log_or)。如果直接传入原始置信区间值,matplotlib会把这些值当成误差的绝对值,而非相对于均值的偏移,自然会得到错误的误差区间。
正确实现代码
import matplotlib.pyplot as plt # 计算不对称误差的偏移量 xerr = [ mydf['log_or'] - mydf['conf_low'], # 左误差:均值到下界的距离 mydf['conf_high'] - mydf['log_or'] # 右误差:上界到均值的距离 ] # 绘制横向误差棒图 plt.figure(figsize=(8, 4)) plt.errorbar( x=mydf['log_or'], y=mydf['Feature'], xerr=xerr, fmt='o', # 数据点样式 capsize=5 # 误差棒帽的长度 ) plt.xlabel('log(OR)') plt.ylabel('Feature') plt.title('误差棒图(使用预计算置信区间)') plt.show()
这段代码会准确使用你预计算的conf_low和conf_high绘制误差区间,误差棒的左右范围完全匹配给定的置信区间。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

