如何在散点图中对x轴分组实现对应y轴数值的聚类效果?
实现方案与推荐图表类型
散点图实现聚类效果的方法
你可以通过分箱+抖动处理的方式实现需求,步骤如下:
- 先对x值做分箱处理:按照你设定的0、4、8刻度,划分出
[0,4)、[4,8)两个区间,给每个区间分配一个统一的x轴中心值(比如两个区间的中心分别设为2、6),让同一区间的所有点x坐标先对齐到中心位置 - 给对齐后的x坐标添加小范围随机扰动(jitter):扰动范围控制在±0.2~0.5之间,避免同一区间内y值相同的点完全重叠,自然形成簇状聚集效果
- 最后显式设置x轴刻度为
[0,4,8],隐藏中间的次要刻度即可
你提供的原始数据散点图如下:
以下是Python实现的参考代码:
import matplotlib.pyplot as plt import numpy as np # 原始数据 x = np.array([1,2,3,4,5,6,7]) y = np.array([1,2,2,2,3,4,5]) # 分箱配置 bin_edges = [0,4,8] bin_centers = [2, 6] # 给每个x值分配对应箱的中心坐标 x_binned = np.array([bin_centers[0] if xi < 4 else bin_centers[1] for xi in x]) # 添加随机扰动避免重叠 x_jitter = x_binned + np.random.uniform(-0.3, 0.3, size=len(x)) # 绘图设置 plt.scatter(x_jitter, y) plt.xticks(bin_edges) plt.show()
更适合的替代图表类型
相比手动调整的散点图,以下图表更适配你的需求:
- 蜂群图(Swarm Plot):自带分箱、避免点重叠的逻辑,不需要手动加扰动,同一区间的点会自动排列成簇,点的分布密度直接对应y值的出现频率,完全匹配你要的聚类效果
- 箱线图(Box Plot):每个x区间对应一个箱形,可直接展示该区间内y值的中位数、四分位范围、极值和异常值,适合快速对比不同区间的y值整体分布
- 小提琴图(Violin Plot):在箱线图的基础上叠加了y值的核密度分布,能更直观展示哪个y值的出现频次更高,同时保留了统计量信息
内容的提问来源于stack exchange,提问作者Sadaf Shafi
相关产品推荐
相关产品推荐

