哑铃图:数据对比的优雅之选

news/2026/1/22 23:32:53/文章来源:https://www.cnblogs.com/wang_yb/p/19519312

简洁的线条连接两个数据点,就像哑铃的两端,在对比分析中展现出令人惊艳的清晰度。

在平时的数据分析项目中,我经常会遇到比较两个相关数据集的变化情况。

这时,传统的做法是使用堆积条形图或簇状条形图,但它们存在一个共同问题:当我们需要精确追踪每个项目在两个时间点或两种条件下的变化时,这些图表会让我们的眼睛在条形之间来回跳跃,难以直观把握变化的幅度和方向。

今天,我要向大家推荐一种更优雅的替代方案--哑铃图

1. 哑铃图是什么?

哑铃图Dumbbell Plot),有时也称为DNA图杠铃图,是一种用于比较两个相关数据点的可视化图表。

它源于人们对更有效数据比较方式的持续探索。

在传统的时间序列比较中,我们通常使用两条折线,但当需要比较的项目较多时,折线图会变得混乱。哑铃图通过将比较焦点放在每个项目的两个状态上,解决了多项目对比时的视觉混乱问题。

它的基本结构很简单:

  • 每个观察单位(如产品、地区、时间段)对应两个数据点
  • 这两个数据点由一条直线(或线段)连接
  • 整个图形看起来像一排排哑铃,因而得名

2. 实现原理

哑铃图的核心设计理念是最小化认知负荷

当我们需要比较A和B时,最直接的方式就是把它们放在一起,用一条线连接,然后观察这条线的长度(差异大小)和方向(哪个更大)。

matplotlib中创建哑铃图,我们主要使用以下元素:

  • 散点图:表示两个数据点
  • 直线段:连接两个相关点
  • 颜色编码:通常用不同颜色区分前后状态或不同组别
  • 标签系统:清晰标识每个观察单位

3. 实战示例

接下来,我们看看哑铃图在实际场景中的显示效果。

假设我们是一家电商公司的数据分析师,需要比较8个主要产品类别在2022年和2023年的销售额变化。

(完整的代码在文章末尾提供下载地址,文中只截取部分代码)

先创建一些测试数据:

# 示例数据:8个产品类别在2022年和2023年的销售额(单位:万元)
categories = ["电子产品","服装鞋帽","家居用品","美妆护肤","图书音像","运动户外","食品饮料","母婴用品",
]
sales_2022 = [85, 92, 78, 65, 45, 60, 88, 72]
sales_2023 = [95, 87, 85, 78, 52, 73, 95, 80]

然后,我们绘制传统的簇状条形图和哑铃图来对比一下效果:

# 创建子图,对比两种可视化方法
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 8))# 簇状条形图
x = np.arange(len(categories))bars1 = ax1.bar(x - width/2, sales_2022, width, label='2022年', color='#4C72B0', alpha=0.8)
bars2 = ax1.bar(x + width/2, sales_2023, width, label='2023年', color='#DD8452', alpha=0.8)# 在每个条形上添加数值标签
# 省略 ...# 哑铃图
# 设置y轴位置(每个类别的垂直位置)
y_pos = np.arange(len(categories))# 绘制连接线
for i, (y2022, y2023) in enumerate(zip(sales_2022, sales_2023)):# 确定线颜色:增长为绿色,下降为红色line_color = '#55A868' if y2023 > y2022 else '#C44E52'ax2.plot([y2022, y2023], [i, i], color=line_color, linewidth=2.5, alpha=0.7, zorder=1)# 绘制数据点
ax2.scatter(sales_2022, y_pos, s=120, color='#4C72B0', alpha=0.9, label='2022年', zorder=2, edgecolors='white', linewidth=2)
ax2.scatter(sales_2023, y_pos, s=120, color='#DD8452', alpha=0.9, label='2023年', zorder=2, edgecolors='white', linewidth=2)# 省略 ...plt.tight_layout()
plt.show()

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

  • 变化一目了然:连接线的长度直观表示变化幅度,方向表示增长或下降
  • 减少视觉跳跃:眼睛不需要在条形间来回移动,而是沿着水平线自然追踪
  • 突出比较重点:专注于每个项目的两个状态对比,而非绝对数值

进一步,我们还可以给哑铃图排序,按照增长由快到慢给各个品类排序,这样自然形成从"下降最显著"到"增长最显著"的连续谱,模式自动显现,无需刻意寻找。

比如上面的哑铃图中,【服装鞋帽】这个品类其实销售额是下降的,混在一堆哑铃中不容易看出来吧?

# 创建排序后的哑铃图
fig, ax = plt.subplots(figsize=(10, 8))# 按变化幅度排序
sorted_indices = np.argsort([sales_2023[i] - sales_2022[i] for i in range(len(categories))]
)
sorted_categories = [categories[i] for i in sorted_indices]
sorted_2022 = [sales_2022[i] for i in sorted_indices]
sorted_2023 = [sales_2023[i] for i in sorted_indices]# 绘制连接线
# 省略 ...# 绘制数据点
# 省略 ...# 添加变化箭头标注
# 省略 ...plt.tight_layout()
plt.show()

这样改造后,由上到下的哑铃,越来越短(也就是增长越来越慢),最底部的那个是负增长,用了红色来标注。

4. 总结

数据可视化的核心目标是有效传达信息。当我们需要强调变化、比较两个相关状态时,哑铃图提供了一种简洁而强大的解决方案。

就像选择合适的工具完成工作一样,在面对数据比较任务时,我们应该根据具体需求选择最合适的可视化形式:

  • 当需要比较多个项目的两个状态时,选择哑铃图
  • 当需要展示单个项目的多个组成部分时,选择堆积条形图
  • 当需要比较多个项目的多个类别时,选择簇状条形图

最好的可视化不是最复杂的,而是能让观众在最短时间内理解最多信息的那个。

哑铃图正是这样一种高效的工具,它用最简单的线条连接,讲述了数据世界中最动人的变化故事。

下次做报告时,不妨试着把那张拥挤的簇状条形图换成哑铃图,相信你的观众会感叹:“哇,这张图做得真专业!”

完整代码:哑铃图.ipynb (访问密码: 6872)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1202107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026口碑炸裂!学历提升机构实测+避坑指南,上班族/零基础必看

2026口碑炸裂!学历提升机构实测+避坑指南,上班族/零基础必看一、开篇:学历提升选机构?这些痛点你中了几个? 最近后台都快被 “学历提升选哪家机构” 这类问题刷屏啦!“上班族平时忙得脚不沾地,根本没时间备考,…

【课程设计/毕业设计】基于springboot的咖啡共赏平台咖啡销售平台【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Java计算机毕设之基于vue的某电子企业智能生产信息系统的设计(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

ext2文件系统(2)inode,datablock映射,路径解析与缓存,分区挂载,软硬连接

本章目标 1.inode与datablock映射 2.目录与文件名 3.路径解析 4.路径缓存 5.分区挂载 6.软硬连接 1.inode与datablock映射 我们之前说过inode保存着一个文件的大部分属性信息,我们管它叫做元数据 其种inode中有一个inode number的东西来标识一个文件用来区分其他文件的标识 …

Java毕设项目推荐-基于JAVA绍兴旅游系统基于springboot的绍兴旅游系统【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

【课程设计/毕业设计】基于Springboot工厂生产管理系统springboot的某电子企业智能生产信息系统的设计【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Java毕设项目推荐-基于springboot的莆田学院停车场管理系统车牌自动识别、车位实时监控、智能计费、在线支付【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

基于STM32的心率血氧手环设计与实现

基于STM32的心率血氧手环设计与实现 摘要 随着健康监测技术的快速发展,便携式健康监测设备因其小巧、便捷、实时性强等优势,逐渐成为大众日常健康管理的重要工具。本文设计了一款基于STM32F103C8T6微控制器的多功能心率血氧手环,集成心率血…

【课程设计/毕业设计】基于springboot面试刷题平台系统的设计与实现基于springboot的面试试题管理系统【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

【毕业设计】基于springboot的面试试题管理系统(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Java毕设项目推荐-基于springboot的某电子工厂生产管理系统【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

【毕业设计】基于springboot的咖啡共赏平台(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

上班族学历提升指南:选对机构,开启逆袭之路

上班族学历提升指南:选对机构,开启逆袭之路职场 “学历焦虑”:为何提升学历刻不容缓? 在当今竞争激烈的职场环境中,学历如同一块沉甸甸的敲门砖,深刻影响着上班族的职业发展轨迹。数据显示,超六成在职者通过成人…

Node.js用Buffer.alloc安全创建缓冲区

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Node.js安全实践:Buffer.alloc()如何防止二进制数据泄露 目录 Node.js安全实践:Buffer.alloc()如何防止二…

2026 年 AI PPT 工具实测报告:告别碎片化拼凑,全流程生成才是职场效率分水岭

摘要 / 引言2026 年,AI PPT 已然成为职场效率的关键变量。在如今快节奏的职场环境中,能否高效地完成 PPT 制作,成为了区分职场人工作效率的“效率分水岭”。有些职场人借助先进的 AI PPT 工具,能在短时间内高质量地完成任务&#…

【计算机毕业设计案例】基于Java springboot企业知识产权数据系统基于springboot的企业内部知识产权管理系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026 年 AI PPT 工具年度复盘:全流程工具如何抹平职场新人与老手的效率差距

摘要 / 引言2026 年,AI PPT 已然成为职场效率的关键变量。在如今快节奏的职场环境中,能否高效地完成 PPT 制作,成为了区分职场人工作效率的“效率分水岭”。不同的 AI PPT 工具,在功能、性能、适用性等方面存在着显著差异&#xf…

Ubuntu环境下安装MySQL

Ubuntu 环境下安装 MySQL sudo apt install mysql-serversudo apt install libmysqlclient-dev查看 MySQL 服务的启动状态 systemctl status mysql手动启动 MySQL 服务 systemctl start mysql查看 MySQL 默认的密码 sudo cat /etc/mysql/debian.cnf# Automatically generated f…

026 年办公效率工具指南:AI 生成 PPT 不再是选择题,而是职场生存的必选项

摘要 / 引言2026 年,AI PPT 已然成为职场效率的关键变量。不同的人使用不同的 AI PPT 工具,工作效率出现了巨大的差异,这就形成了所谓的“效率分水岭”。有的人能快速完成高质量的 PPT,而有的人却还在为制作 PPT 而焦头烂额。本文…

【计算机毕业设计案例】基于springboot的绍兴旅游系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…