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

如何绘制带连线点的Swarmplot并与带hue的Boxplot对齐

解决hue分组后受试者Pre/Post数据点连线对齐问题

核心问题是当用hue按年龄分组时,每个x轴类别(Pre/Post)下的不同分组会被横向错开,直接基于x轴刻度值连线会导致错位。以下是可行的解决方法:

步骤1:数据准备(确保长格式)

首先确保你的数据是长格式,包含受试者ID、年龄组、测试时间(Pre/Post)、测试分数这几个关键列。示例数据如下:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 构造样本数据集(和实际数据结构一致)
data = pd.DataFrame({
    'ID': [1,1,2,2,3,3,4,4,5,5,6,6],
    'Age_Group': ['Young','Young','Young','Young','Old','Old','Old','Old','Young','Young','Old','Old'],
    'Time': ['Pre','Post','Pre','Post','Pre','Post','Pre','Post','Pre','Post','Pre','Post'],
    'Score': [70,75,65,72,60,68,58,65,72,78,63,70]
})

步骤2:绘制对齐的箱线图+散点图+连线

关键是利用dodge=True让箱线图和散点图的分组横向错开,再通过计算偏移量让连线精准对应到每个分组的位置:

sns.set_style("whitegrid")
fig, ax = plt.subplots(figsize=(8,6))

# 绘制箱线图:dodge=True实现分组错开,width控制箱体宽度
box_plot = sns.boxplot(
    x='Time', y='Score', hue='Age_Group', data=data,
    dodge=True, width=0.4, ax=ax, palette='Set2'
)

# 绘制散点图:dodge=True和箱线图对齐,保证数据点在对应分组上方
swarm_plot = sns.swarmplot(
    x='Time', y='Score', hue='Age_Group', data=data,
    dodge=True, ax=ax, color='black', size=8
)

# 移除重复的图例(箱线图和散点图会生成两份图例)
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[:2], labels[:2], title='Age Group')

# 计算分组偏移量:箱体宽度的一半,用于调整连线的x坐标
offset = box_plot.width / 2

# 遍历每个受试者,绘制Pre到Post的连线
for subject_id in data['ID'].unique():
    subj_data = data[data['ID'] == subject_id]
    # 获取该受试者所属的年龄组
    group = subj_data['Age_Group'].iloc[0]
    # 根据年龄组确定偏移方向(对应箱线图的分组顺序)
    x_shift = -offset if group == 'Young' else offset
    
    # 获取Pre和Post的分数值
    pre_score = subj_data[subj_data['Time'] == 'Pre']['Score'].iloc[0]
    post_score = subj_data[subj_data['Time'] == 'Post']['Score'].iloc[0]
    
    # 绘制连线:x坐标为原始刻度(Pre=0,Post=1)加上偏移量
    ax.plot(
        [0 + x_shift, 1 + x_shift], [pre_score, post_score],
        color='gray', linestyle='--', alpha=0.7
    )

plt.title('Pre vs Post Test Scores by Age Group')
plt.xlabel('Test Time')
plt.ylabel('Score')
plt.show()

关键原理说明

  • dodge=True:让boxplot和swarmplot中不同hue分组的元素在同一x轴类别下横向错开,保证视觉对齐。
  • 偏移量计算:箱体宽度的一半是每个分组相对于x轴原始刻度的偏移距离,确保连线的起点和终点精准对应到该受试者所在分组的位置。
  • 遍历受试者:通过ID匹配同一受试者的Pre/Post数据,结合分组偏移量绘制连线,解决错位问题。

内容的提问来源于stack exchange,提问作者Zaida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:27:35