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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:27:01