如何用Matplotlib绘制带置信区间的横向散点图并区分区间内外点
Matplotlib 横向置信区间对比图实现方案
直接提供可运行的完整实现代码:
import matplotlib.pyplot as plt # 定义输入数据 labelstr = ['name1', 'name2', 'name3'] values = [2.1, 40.5, 10.9] lower_bound = [1.8, 38.9, 10.2] upper_bound = [2.3, 43.8, 10.7] # 配置绘图参数 in_color = '#27ae60' # 区间内点的颜色 out_color = '#e74c3c' # 区间外点的颜色 ci_color = '#95a5a6' # 置信区间线的颜色 y_pos = list(range(len(labelstr))) # 判断数据点是否落在置信区间内 point_in_ci = [lb <= val <= ub for val, lb, ub in zip(values, lower_bound, upper_bound)] # 计算置信区间的左右偏移量,适配errorbar的xerr参数 xerr = [ [val - lb for val, lb in zip(values, lower_bound)], [ub - val for val, ub in zip(values, upper_bound)] ] # 创建画布 plt.figure(figsize=(8, 4), dpi=100) # 绘制横向置信区间误差棒 plt.errorbar( x=values, y=y_pos, xerr=xerr, fmt='none', ecolor=ci_color, capsize=5, zorder=1 ) # 绘制数据点,按是否在区间内区分颜色 plt.scatter( x=values, y=y_pos, c=[in_color if flag else out_color for flag in point_in_ci], s=80, zorder=2 ) # 添加数值标注 for idx, (val, lb, ub, y) in enumerate(zip(values, lower_bound, upper_bound, y_pos)): # 标注数据点数值 plt.text(val + 0.2, y, f'{val:.1f}', va='center', fontsize=10) # 标注置信区间下限 plt.text(lb - 0.5, y, f'{lb:.1f}', va='center', fontsize=9, color=ci_color) # 标注置信区间上限 plt.text(ub + 0.2, y, f'{ub:.1f}', va='center', fontsize=9, color=ci_color) # 调整坐标轴与样式 plt.yticks(y_pos, labelstr, fontsize=11) plt.xlabel('数值', fontsize=11) plt.grid(axis='x', linestyle='--', alpha=0.6) plt.tight_layout() plt.show()
关键实现说明
- 颜色区分逻辑:提前遍历所有数据点判断是否在置信区间范围内,分别映射对应颜色,可自行修改颜色参数调整视觉效果
- 横向误差棒适配:
errorbar的xerr参数需要传入左右两个方向的偏移值,而非直接传入上下限原始数值,代码中已经做了对应转换 - 数值标注偏移:标注文本默认设置了固定像素偏移,如果数据量级差异较大,可以把偏移值改成按数值比例计算,避免遮挡
- 示例数据中name3的数值10.9大于置信区间上限10.7,运行代码后会显示为红色点,其余两个点为绿色,符合需求
内容的提问来源于stack exchange,提问作者cinelli88
相关产品推荐
相关产品推荐

