数据“显微镜”:蜂群图让每个数据点都发声 [复制链接]
发表于 2026-1-31 13:32:07 | 显示全部楼层 |阅读模式
想象一下夏季的花丛中,成群的蜜蜂围绕着花朵繁忙地飞舞。每只蜜蜂都是一个独立的数据点,它们既保持群体聚集的形态,又不会完全重叠在一起。
这就是蜂群图(Swarm Plot)的核生理念——在有限的空间内展示全部数据点,让每个点都能被清晰望见。
蜂群图是一种特殊的数据可视化图表,它将分类数据与数值数据团结起来,展示数据的分布环境。
与传统的条形图或箱线图差异,蜂群图不举行任何数据聚合,而是展示每一个原始数据点,制止了信息丢失。
1. 蜂群图焦点特点

蜂群图最奥妙的地方在于它的结构算法。
当多个数据点具有相似数值时,它们不会简单地重叠在一起,而是像有“排挤力”一样,在垂直方向(或程度方向)上轻微偏移,形成一个雷同蜂群的分布。
比如,下面是同一组数据散点图蜂群图中展示的效果。

从中可以看出蜂群图的焦点特点有:

  • 绝不重叠: 它通过算法检测数据点的重叠环境,一旦发现两个点数值相近,就会主动把它们向程度方向推开。
  • 生存分布形态: 散开后的形状,自然形成了一种雷同“小提琴”或“山峰”的外貌,直观地展示了数据的密度。
  • 参数调解: 我们可以调解点的巨细(marker size)和分列的精密程度。点越大,视觉打击力越强,但必要的程度空间也越多。
2. 蜂群图 vs. 条形图:从择要到细节

条形图就像是一份数据择要陈诉,它告诉我们每个种别的均匀值或总计值,但潜伏了数据内部的分布细节。
蜂群图则像是一次数据点的全员大会,每个数据点都有发言的时机。
下面针对同一组数据,我们分别绘制了条形图箱线图蜂群图,一起来感受一下它们之间差异的展示效果。
  1. # 生成示例数据
  2. np.random.seed(123)
  3. categories = ["产品A", "产品B", "产品C", "产品D"]
  4. data_comparison = []
  5. for category in categories:
  6.     n_points = 40
  7.     if category == "产品A":
  8.         values = np.random.normal(75, 8, n_points)
  9.     elif category == "产品B":
  10.         values = np.random.normal(82, 12, n_points)
  11.     elif category == "产品C":
  12.         values = np.random.normal(65, 5, n_points)
  13.     else:  # 产品D
  14.         # 创建一个双峰分布
  15.         values1 = np.random.normal(55, 6, n_points // 2)
  16.         values2 = np.random.normal(85, 7, n_points // 2)
  17.         values = np.concatenate([values1, values2])
  18.     for value in values:
  19.         data_comparison.append({"产品": category, "用户评分": value})
  20. # 1. 条形图(平均值)
  21. means = []
  22. for category in categories:
  23.     cat_data = [d["用户评分"] for d in data_comparison if d["产品"] == category]
  24.     means.append(np.mean(cat_data))
  25. bars = axes[0].bar(
  26.     categories, means, color=["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728"]
  27. )
  28. # 在条形上标注平均值
  29. # 省略...
  30. # 2. 箱线图
  31. box_data = []
  32. for category in categories:
  33.     cat_data = [d["用户评分"] for d in data_comparison if d["产品"] == category]
  34.     box_data.append(cat_data)
  35. boxplot = axes[1].boxplot(
  36.     box_data, tick_labels=categories, patch_artist=True, boxprops=dict(facecolor="lightblue")
  37. )
  38. # 省略...
  39. # 3. 蜂群图
  40. data_df = pd.DataFrame(data_comparison)
  41. sns.swarmplot(
  42.     x="产品",
  43.     y="用户评分",
  44.     hue="产品",
  45.     data=data_df,
  46.     ax=axes[2],
  47.     size=5,
  48.     palette="Set2",
  49.     edgecolor="black",
  50.     linewidth=0.5,
  51. )
  52. # 省略...
  53. plt.tight_layout()
  54. plt.show()
复制代码

绘制蜂群图可以用seaborn这个库中的swarmplot函数。
从上面的对比可以看出:

  • 条形图告诉我们产物D的均匀分约为70分
  • 箱线图提示产物D的数据分布范围很广
  • 但只有蜂群图清晰地显现了产物D现实上有两个显着的用户群体:一个低评分群体和一个高评分群体
3. 蜂群图 vs. 散点图:从紊乱到有序

传统散点图在处理惩罚分类数据时,常常导致数据点大量重叠,形成"黑团",我们无法看清数据点的真实分布。
蜂群图通过智能结构算法办理了这个题目。
下面构造一个差异密度的数据,看看蜂群图和散点图的展示效果。
  1. # 比较散点图与蜂群图的视觉效果
  2. fig, axes = plt.subplots(1, 2, figsize=(14, 6))
  3. # 生成具有不同密度的数据
  4. np.random.seed(42)
  5. density_data = []
  6. categories = ["低密度", "中等密度", "高密度"]
  7. for i, category in enumerate(categories):
  8.     n_points = 20 + i * 30  # 不同密度
  9.     if category == "低密度":
  10.         values = np.random.normal(50, 15, n_points)
  11.     elif category == "中等密度":
  12.         values = np.random.normal(50, 8, n_points)
  13.     else:  # 高密度
  14.         values = np.random.normal(50, 4, n_points)
  15.     for value in values:
  16.         density_data.append({"类别": category, "数值": value})
  17. # 左侧:传统散点图
  18. for i, category in enumerate(categories):
  19.     cat_data = [d["数值"] for d in density_data if d["类别"] == category]
  20.     x_positions = np.full(len(cat_data), i)
  21.     axes[0].scatter(x_positions, cat_data, alpha=0.6, s=60, label=category)
  22. #省略...
  23. # 右侧:蜂群图
  24. density_data_df = pd.DataFrame(density_data)
  25. sns.swarmplot(
  26.     x="类别",
  27.     y="数值",
  28.     hue="类别",
  29.     data=density_data_df,
  30.     ax=axes[1],
  31.     size=6,
  32.     palette="coolwarm",
  33.     edgecolor="black",
  34.     linewidth=0.5,
  35. )
  36. #省略...
  37. plt.tight_layout()
  38. plt.show()
复制代码

蜂群图办理了 “重叠(Overplotting)” 的题目。在数据量适中(几百到几千个点)时,它是展示分布密度的最佳选择。
4. 蜂群图的实用场景

蜂群图并不是为了代替条形图散点图,它有自己的实用场景和范围性。
适当使用蜂群图的场景:

  • 样本量适中(通常少于几百个点)时,展示完备数据分布
  • 必要同时看到团体趋势和个体数据点
  • 数据有多个分类变量,必要比力差异种别分布
  • 渴望发现非常值或特殊模式(如双峰分布)

蜂群图范围性紧张有:

  • 大数据集大概导致图表过于拥挤
  • 对于非常大规模数据,箱线图或小提琴图大概更符合
  • 精确的数值比力不如条形图直观
5. 总结

蜂群图就像数据可视化范畴的"显微镜",它让我们既能观察到数据的团体分布形态,又能看到每一个数据点的详细位置。
与只能表现择要信息的条形图和轻易产生重叠的散点图相比,蜂群图在表现中小型数据集的完备分布信息方面具有独特上风。
在数据可视化实践中,选择精确的图表范例就像选择精确的工具一样紧张。
当下一次你必要展示分类数据的分布时,不妨实验一下蜂群图,它大概会显现出你从未留意到的数据秘密。
文中的完备代码共享在:蜂群图.ipynb (访问暗码: 6872)

免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表