当前位置: 首页 > news >正文

哑铃图:数据对比的优雅之选合集 - 数据可视化(66)

哑铃图是什么?

哑铃图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. 总结

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

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

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

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

http://www.gsyq.cn/news/1612636.html

相关文章:

  • Python+Appium自动化测试实战:头条视频自动播放脚本开发指南
  • 美团1.6万亿模型用国产芯片跑出来的,性能还超了GPT-5.5和Claude
  • SQL注入手工检测全流程:从原理到实战的深度解析
  • AI Agent平台架构设计:从核心原理到高可用实现与面试指南
  • 告别点灯!用ESP8266+Arduino IDE做个能远程控制的智能开关(附完整代码)
  • 告别Transformer卡顿?手把手带你用Vision Mamba跑通ImageNet分类(附代码)
  • 安达发|aps自动排单:为纺织行业数字化生产注入“增效魔法”
  • 从零实现Transformer:自注意力机制、多头注意力与位置编码详解
  • Node.js性能测试终极指南:Artillery与k6深度对比与实践
  • 告别路由器!用一根网线让ZYNQ7020开发板共享笔记本WiFi上网(Win10保姆级教程)
  • 【VMware NAT端口转发终极指南】:20年虚拟化专家亲授5步精准配置法,99%用户忽略的3个致命陷阱!
  • 保姆级教程:用ESP8266-01和AT指令,5分钟搞定阿里云物联网平台设备连接与数据收发
  • 告别Transformer卡顿?手把手带你用Vision Mamba跑通高分辨率图像分类(附代码)
  • Next.js项目Cypress自动化测试实战:从配置到CI/CD集成
  • wecomapi开发企业微信客户跟进记录如何与消息、标签和工单关联
  • 别再手动建模了!用Python脚本批量生成FreeCAD零件(附随机参数化代码)
  • 在树莓派4B上部署MobileNet-SSD:用OpenCV和Python实现实时物体检测(附完整代码)
  • OVF导出卡在“正在打包”?紧急排查清单来了,10分钟定位磁盘校验、SSL证书、权限三重故障源
  • 用状态机搞定蓝桥杯嵌入式电梯题:STM32G431实战避坑指南
  • 【VMware虚拟网络架构实战指南】:3步搞定多台虚拟机跨网段通信,99%工程师都忽略的5个关键配置
  • Beehive配置加密实战:Spring Boot敏感信息保护与密钥管理
  • 苏州GEO优化:企业内容正在进入“AI可理解”的新阶段
  • 别再手动建模了!用Python脚本批量生成FreeCAD零件,效率提升10倍
  • mavonEditor代码块功能深度探索:从基础语法到高级定制的完整指南
  • 影响游戏开发报价的6大核心真相
  • YOLO与3D点云融合:从原理到实战的3D目标检测指南
  • Ubuntu部署svn1.14.3及权限控制
  • E-Hentai下载器终极指南:三步完成画廊图片批量打包下载
  • 数存科技 × 银河麒麟 V11|全栈适配・全域安全
  • 3分钟掌握AutoTask:安卓自动化神器终极指南