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

如何在Seaborn Stripplot中添加各颜色组的极值差值标注

解决方案:在Seaborn Stripplot上标注极值差值或绘制范围垂直线

问题背景

你使用的基础Stripplot代码:

ax = sns.stripplot(x="day", y="total_bill", hue="smoker",
                   data=tips, palette="Set2", dodge=True)

已计算出各颜色组在x轴三个分组(12、13、14)中的极值数据:

extreme_data = {
    "320": (29.977999999084474, 35.66800000610352),
    "384": (33.4459999987793, 36.849999999389645),
    "448": (34.49400000915527, 37.29800001159668)
}

以下提供两种直接可落地的实现方法:


方法1:绘制垂直线展示极值范围(直观展示区间)

利用Matplotlib的plot()绘制垂直区间线,同时标注差值,颜色与对应分组匹配:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# 替换为你的实际数据与x轴类别
tips = sns.load_dataset("tips")
x_categories = ["12", "13", "14"]  # 你的x轴分组
extreme_data = {
    "320": (29.978, 35.668),
    "384": (33.446, 36.850),
    "448": (34.494, 37.298)
}

# 绘制基础Stripplot
ax = sns.stripplot(x="day", y="total_bill", hue="smoker",
                   data=tips, palette="Set2", dodge=True)

# 获取各hue分组的颜色(匹配Stripplot的配色)
hue_colors = {patch.get_label(): patch.get_facecolor() for patch in ax.patches[:len(extreme_data)]}
# 计算Dodge模式下的水平偏移量(同一x分组内不同hue的间隔)
dodge_width = ax.patches[1].get_x() - ax.patches[0].get_x() if len(ax.patches) > 1 else 0.2
x_base_positions = np.arange(len(x_categories))

# 遍历每个x分组和hue分组,绘制垂直线并标注差值
for idx, x_cat in enumerate(x_categories):
    for group_idx, (group_name, (min_val, max_val)) in enumerate(extreme_data.items()):
        # 计算当前分组的x坐标(基础位置 + 偏移)
        x_pos = x_base_positions[idx] + (group_idx - len(extreme_data)/2 + 0.5) * dodge_width
        # 绘制极值垂直线
        ax.plot([x_pos, x_pos], [min_val, max_val], color=hue_colors[group_name], linewidth=2, zorder=10)
        # 计算差值并标注在垂直线上方
        diff = max_val - min_val
        ax.text(x_pos, max_val + 0.3, f"{diff:.2f}", ha="center", color=hue_colors[group_name], fontweight="bold", zorder=11)

# 调整布局避免遮挡
plt.tight_layout()
plt.show()

方法2:仅标注极值差值(简洁展示数值)

如果不需要区间线,直接在对应分组位置标注差值:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

tips = sns.load_dataset("tips")
x_categories = ["12", "13", "14"]
extreme_data = {
    "320": (29.978, 35.668),
    "384": (33.446, 36.850),
    "448": (34.494, 37.298)
}

ax = sns.stripplot(x="day", y="total_bill", hue="smoker",
                   data=tips, palette="Set2", dodge=True)

hue_colors = {patch.get_label(): patch.get_facecolor() for patch in ax.patches[:len(extreme_data)]}
dodge_width = ax.patches[1].get_x() - ax.patches[0].get_x() if len(ax.patches) > 1 else 0.2
x_base_positions = np.arange(len(x_categories))

for idx, x_cat in enumerate(x_categories):
    for group_idx, (group_name, (min_val, max_val)) in enumerate(extreme_data.items()):
        x_pos = x_base_positions[idx] + (group_idx - len(extreme_data)/2 + 0.5) * dodge_width
        # 将差值标注在分组上方(可调整y_pos位置)
        y_pos = ax.get_ylim()[1] * 0.95
        diff = max_val - min_val
        ax.text(x_pos, y_pos, f"{group_name}: {diff:.2f}", ha="center", color=hue_colors[group_name], fontsize=9)

plt.tight_layout()
plt.show()

关键细节

  • 颜色匹配:通过ax.patches提取Stripplot的分组颜色,确保标注与线条颜色和对应组一致。
  • Dodge偏移:自动计算dodge_width,适配不同数量的hue分组,避免手动调整位置。
  • 数值格式化:f"{diff:.2f}"可调整小数位数,让展示更整洁。

内容的提问来源于stack exchange,提问作者S.EB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:35:10