哑铃图:数据对比的优雅之选 [复制链接]
发表于 2026-1-22 22:12:56 | 显示全部楼层 |阅读模式
轻便的线条毗连两个数据点,就像哑铃的两头,在对比分析中显现出令人惊艳的清楚度。
在平常的数据分析项目中,我常常会碰到比力两个干系数据集的变革环境。
这时,传统的做法是使用堆积条形图或簇状条形图,但它们存在一个共同题目:当我们须要正确追踪每个项目在两个时间点或两种条件下的变革时,这些图表会让我们的眼睛在条形之间来回跳跃,难以直观把握变革的幅度和方向。
本日,我要向各人保举一种更优雅的更换方案--哑铃图
1. 哑铃图是什么?

哑铃图(Dumbbell Plot),偶然也称为DNA图杠铃图,是一种用于比力两个干系数据点的可视化图表。
它源于人们对更有用数据比力方式的一连探索。
在传统的时间序列比力中,我们通常使用两条折线,但当须要比力的项目较多时,折线图会变得紊乱。哑铃图通过将比力焦点放在每个项目标两个状态上,办理了多项目对比时的视觉紊乱题目。
它的根本布局很简朴:

  • 每个观察单位(如产物、地域、时间段)对应两个数据点
  • 这两个数据点由一条直线(或线段)毗连
  • 整个图形看起来像一排排哑铃,因而得名
2. 实现原理

哑铃图的焦点计划理念是最小化认知负荷
当我们须要比力A和B时,最直接的方式就是把它们放在一起,用一条线毗连,然后观察这条线的长度(差别巨细)和方向(哪个更大)。
在matplotlib中创建哑铃图,我们重要使用以下元素:

  • 散点图:表现两个数据点
  • 直线段:毗连两个干系点
  • 颜色编码:通常用差别颜色区分前后状态或差别组别
  • 标签体系:清楚标识每个观察单位
3. 实战示例

接下来,我们看看哑铃图在实际场景中的表现效果。
假设我们是一家电商公司的数据分析师,须要比力8个重要产物种别在2022年和2023年的贩卖额变革。
(完备的代码在文章末端提供下载地点,文中只截取部分代码
先创建一些测试数据:
  1. # 示例数据:8个产品类别在2022年和2023年的销售额(单位:万元)
  2. categories = [
  3.     "电子产品",
  4.     "服装鞋帽",
  5.     "家居用品",
  6.     "美妆护肤",
  7.     "图书音像",
  8.     "运动户外",
  9.     "食品饮料",
  10.     "母婴用品",
  11. ]
  12. sales_2022 = [85, 92, 78, 65, 45, 60, 88, 72]
  13. sales_2023 = [95, 87, 85, 78, 52, 73, 95, 80]
复制代码
然后,我们绘制传统的簇状条形图和哑铃图来对比一下效果:
  1. # 创建子图,对比两种可视化方法
  2. fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 8))
  3. # 簇状条形图
  4. x = np.arange(len(categories))
  5. bars1 = ax1.bar(x - width/2, sales_2022, width, label='2022年', color='#4C72B0', alpha=0.8)
  6. bars2 = ax1.bar(x + width/2, sales_2023, width, label='2023年', color='#DD8452', alpha=0.8)
  7. # 在每个条形上添加数值标签
  8. # 省略 ...
  9. # 哑铃图
  10. # 设置y轴位置(每个类别的垂直位置)
  11. y_pos = np.arange(len(categories))
  12. # 绘制连接线
  13. for i, (y2022, y2023) in enumerate(zip(sales_2022, sales_2023)):
  14.     # 确定线颜色:增长为绿色,下降为红色
  15.     line_color = '#55A868' if y2023 > y2022 else '#C44E52'
  16.     ax2.plot([y2022, y2023], [i, i], color=line_color, linewidth=2.5, alpha=0.7, zorder=1)
  17. # 绘制数据点
  18. ax2.scatter(sales_2022, y_pos, s=120, color='#4C72B0', alpha=0.9, label='2022年', zorder=2, edgecolors='white', linewidth=2)
  19. ax2.scatter(sales_2023, y_pos, s=120, color='#DD8452', alpha=0.9, label='2023年', zorder=2, edgecolors='white', linewidth=2)
  20. # 省略 ...
  21. plt.tight_layout()
  22. plt.show()
复制代码

通过上面的对比,我们可以清楚地看到哑铃图的上风:

  • 变革一清二楚:毗连线的长度直观表现变革幅度,方向表现增长或降落
  • 镌汰视觉跳跃:眼睛不须要在条形间来回移动,而是沿着水平线天然追踪
  • 突出比力重点:专注于每个项目标两个状态对比,而非绝对数值
进一步,我们还可以给哑铃图排序,按照增长由快到慢给各个品类排序,如许天然形成从"降落最明显"到"增长最明显"的一连谱,模式主动显现,无需刻意探求。
好比上面的哑铃图中,【服装鞋帽】这个品类实在贩卖额是降落的,混在一堆哑铃中不容易看出来吧?
  1. # 创建排序后的哑铃图
  2. fig, ax = plt.subplots(figsize=(10, 8))
  3. # 按变化幅度排序
  4. sorted_indices = np.argsort(
  5.     [sales_2023[i] - sales_2022[i] for i in range(len(categories))]
  6. )
  7. sorted_categories = [categories[i] for i in sorted_indices]
  8. sorted_2022 = [sales_2022[i] for i in sorted_indices]
  9. sorted_2023 = [sales_2023[i] for i in sorted_indices]
  10. # 绘制连接线
  11. # 省略 ...
  12. # 绘制数据点
  13. # 省略 ...
  14. # 添加变化箭头标注
  15. # 省略 ...
  16. plt.tight_layout()
  17. plt.show()
复制代码

如许改造后,由上到下的哑铃,越来越短(也就是增长越来越慢),最底部的谁人是负增长,用了赤色来标注。
4. 总结

数据可视化的焦点目标是有用转达信息。当我们须要夸大变革、比力两个干系状态时,哑铃图提供了一种轻便而强盛的办理方案。
就像选择符合的工具完成工作一样,在面对数据比力使命时,我们应该根据详细需求选择最符合的可视化情势:

  • 当须要比力多个项目标两个状态时,选择哑铃图
  • 当须要展示单个项目标多个构成部分时,选择堆积条形图
  • 当须要比力多个项目标多个种别时,选择簇状条形图
最好的可视化不是最复杂的,而是能让观众在最短时间内明白最多信息的谁人。
哑铃图正是如许一种高效的工具,它用最简朴的线条毗连,陈诉了数据天下中最动人的变革故事。
下次做陈诉时,不妨试着把那张拥挤的簇状条形图换成哑铃图,信赖你的观众会感叹:“哇,这张图做得真专业!”
完备代码:哑铃图.ipynb (访问暗码: 6872)

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

本帖子中包含更多资源

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

×
回复

使用道具 举报

登录后关闭弹窗

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