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

如何在Python中实现带抖动效果的散点图配对点连线?

解决配对散点图添加抖动并正确连线的问题

核心问题是stripplot的抖动为每个点独立生成,同一配对的pre/post点会得到不同的x偏移,导致连线错位。解决办法是为每个ID生成固定的抖动偏移量,让同一ID的两个点使用相同的偏移,这样连线就能精准对应。

以下是修改后的完整代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

data = [['abc', 'pre', 10], ['abc', 'post', 5], ['bce', 'pre', 10], ['bce', 'post', 5], ['cef', 'pre', 8], ['cef', 'post', 5]]
df = pd.DataFrame(data, columns=['ID', 'time', 'value'])

# 为每个ID生成固定的抖动偏移量(同一ID的pre/post共用同一个偏移)
df['jitter'] = df.groupby('ID')['ID'].transform(lambda x: np.random.uniform(-0.05, 0.05))

# 将time转换为数值,方便添加抖动
df['x_num'] = df['time'].map({'pre': 0, 'post': 1})

# 计算添加抖动后的x坐标
df['x_jitter'] = df['x_num'] + df['jitter']

# 绘制带抖动的散点和配对连线
grouped = df.groupby('ID')
for name, group in grouped:
    # 绘制散点(使用抖动后的x坐标)
    plt.scatter(x=group['x_jitter'], y=group['value'], color='#3C74BC')
    # 绘制连线(同样使用抖动后的x坐标)
    plt.plot(group['x_jitter'], group['value'], color='#3C74BC', linestyle='-', linewidth=1)

# 设置x轴刻度和标签,还原pre/post显示
plt.xticks([0, 1], ['pre', 'post'])
plt.xlabel('time')
plt.ylabel('value')
plt.show()

关键代码说明:

  • df.groupby('ID')['ID'].transform(...):对每个ID组生成一个随机偏移值,组内的pre和post行共用该值,确保配对点的x偏移一致。
  • np.random.uniform(-0.05, 0.05):控制抖动幅度,可根据需求调整范围(比如改成-0.1, 0.1会让抖动更明显)。
  • 手动使用plt.scatter和plt.plot替代seaborn封装函数,能精准控制每个点的坐标,避免stripplot的随机错位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:10:31