【D3.js in Action 3 精译_047】5.2:图形的堆叠(一)—— 图解 D3 中的堆叠布局生成器

news2025/1/4 12:50:04

当前内容所在位置:

  • 第五章 饼图布局与堆叠布局 ✔️
    • 5.1 饼图和环形图的创建
      • 5.1.1 准备阶段(一)
      • 5.1.2 饼图布局生成器(二)
      • 5.1.3 圆弧的绘制(三)
      • 5.1.4 数据标签的添加(四)
      • 5.1.5 DIY-在 Observable 平台实现多个 D3 环形图的绘制
    • 5.2 图形的堆叠 ✔️
      • 5.2.1 堆叠布局生成器(一) ✔️
      • 5.2.2 堆积柱状图的绘制(二)

文章目录

    • 5.2 图形的堆叠 Stacking shapes
      • 5.2.1 堆叠布局生成器 The stack layout generator

《D3.js in Action》全新第三版封面

《D3.js in Action》全新第三版封面

译者按
就让这篇全新介绍 D3 堆积图的文章来结束不平凡的 2024 年吧。由于前期一直忙于另一个专栏《CSS in Depth 2》的收尾工作,更新这篇内容前我还系统回顾了一遍第 1 到 4 章的所有知识点,并且把 5.1 节的 D3 环形图从头到尾动手实现了一遍。不得不说,一个多月没练,相关的知识点多少有些生疏了。遗忘并不可怕,可怕的是以为自己什么都记得;忘了就去复习,一遍不够就多练它几遍,直到练出 D3 的专属 “码感”。

5.2 图形的堆叠 Stacking shapes

至此,我们已经学习了一些简单的信息可视化案例,其中的图形也可以在其他电子表格软件中轻松实现。但您跨入这一行并非只为构建出类似 Excel 这样的图表。您可能想用漂亮的数据惊艳到您的用户,或者凭借您独具品味的审美视角赢得殊荣,又或者通过数据随时间变化规律的完美呈现唤起强烈的情感共鸣。

流图(streamgraph) 是信息可视化领域一种用于描述变化与变更情况的精妙图表类型。流图的构建乍一看貌似颇具挑战,但当您将它的各个部分逐个击破并组合到一块后,也许就不会这么想了。最后您会发现,流图不过是堆积面积图的一种变体形式罢了:每一个图层相互叠加,然后根据靠近中轴线的各组件所占的空间比例自动调整元素上下的面积大小。这种可视化图形的层次结构像生物体的生长一样,具有一种自然的(organic)流动性,呈现出柔和而渐进的变化。我们稍后会重点考察流图的外形特征;在此之前,先来看看它的构建方法。

我们之所以在本书的第一部分就来考察流图,不过是因为它其实也没那么神秘。流图是一种堆积型图表,换句话说它与堆积柱状图在本质上是共通的,如图 5.11 所示。与此同时,流图也与我们在第 4 章中构建的折线图下方的面积图类似,只不过流图中的这些面积区域是堆积在一起的。本节我们将利用 D3 的堆叠与面积生成器(stack and area generators)来实现一个堆积柱状图,然后再实现一个流图。

图 5.11 流图的绘制方法本质上与堆积柱状图类似,它们在 D3 中都是利用堆叠布局生成器实现的

【图 5.11 流图的绘制方法本质上与堆积柱状图类似,它们在 D3 中都是利用堆叠布局生成器实现的】

在 D3 中,堆积柱状图或流图的绘制步骤大同小异,如图 5.12 所示。首先,我们需要初始化一个堆叠布局生成器(stack layout generator)并配置相关参数;然后,将原始数据集传入该堆叠生成器,并由此获得一个含有每个数据点上下边界信息的、带注解的新数据集。如果绘制的是一个流图,还需要初始化一个面积生成器(area generator),方法与上一章介绍的折线生成器、曲线生成器类似。最后,再将新数据集绑定到绘制流图所需的 SVG 图元,即堆积柱状图的矩形条、或者流图中的 path 元素中。如果绘制的是流图,则调用面积生成器函数来计算各路径元素的 d 属性(attribute)值。后续内容将详细考察这些绘制步骤。

图 5.12 D3 堆积型图表的绘制步骤

【图 5.12 D3 堆积型图表的绘制步骤】

5.2.1 堆叠布局生成器 The stack layout generator

堆叠布局生成器(stack layout generator) 是一个 D3 工具函数,其参数为一个包含多个类别的数据集。本章示例用到的数据集为 1973 年至 2019 年各种音乐格式的总销售额。每一种音乐格式对应堆积图中的某个数据系列。

与之前介绍过的饼图布局生成器类似,堆叠布局函数也返回一个带注解信息的新数据集,只不过注解包含的是不同数据系列在 “堆叠” 时的位置信息。堆叠生成器分属 d3-shape 模块。

接下来我们就上手 D3 的堆叠布局,一起来实现 stacked-bars.js 中的 drawStackedBars() 函数逻辑。注意,该函数已经实现了在 ID 为 "bars"div 元素中新增 SVG 容器、进而新增分组元素来作为内部绘图区的相关逻辑。具体方法与第 4 章相同,都遵循 D3 边距约定。

在下列代码片段中,我们先来声明一个堆叠布局生成器,即利用 d3.stack() 方法将其赋给常量 stackGenerator;然后,需要让生成器知晓我们想要堆积的数值(即后续数据系列的具体内容)在数据集的哪个 key 键上。这可以通过配置访问器函数 keys() 来实现,该函数的参数为一个类别 ID 的数组,即每种音乐格式的唯一标识符。该数组可以通过常量数组 formatsInfo 对应的 ID 来构建。此外也可以通过数据集附带的列数组 data.columns 过滤掉年份列 year 得到。具体方法详见 5.1.2 节内容。

最后,调用堆叠生成器函数,并将数据集作为参数传入,就得到了带注解的新数据集,赋给常量 annotatedData

const stackGenerator = d3.stack() // 初始化堆叠布局生成器
  .keys(formatsInfo.map(f => f.id)); // 告知布局函数从数据集的哪个 key 键获取数据来构建数据系列

const annotatedData = stackGenerator(data); // 调用布局生成器,传入 data,得到带注解的数据集,并赋给一个常量

如果将新数据集输出到控制台,会看到一个多维数组结构。如图 5.13 所示,我们先给每个数据系列创建一个数组;数据系列的 ID 值可通过 key 属性获取。该系列数组又包含另一个数组,每个数组对应数据集中的一年。最里层的数组包含相关类别的上下边界值,以及对应年份的原始数据。如果用 d 来表示该数组,则该类别的下边界和上边界可以分别用 d[0]d[1] 来表示。

图 5.13 由堆叠布局生成器返回的带注解的新数据集示意图

【图 5.13 由堆叠布局生成器返回的带注解的新数据集示意图】

可以看到,音乐格式 "vinyl" 为堆叠布局要处理的第一个 key 值。注意它的下边界始终为 0,而上边界对应该格式在这一年的销售额;接下来的类别为 "8-track",其下边界即为 "vinyl" 黑胶唱片的上边界,而加上自身的销售额就得到了 "8-track" 八轨磁带的上边界,这样就形成了一个堆叠效果。

如果对 “堆叠” 的概念还不太清楚,可以参考图 5.14 给出的说明。如果再以 1986 年的数据为例,会看到这一年的音乐销量主要有三种格式类型:黑胶唱片为 28.25 亿美元,磁带为 58.30 亿美元,CS 唱片则为 21.70 亿美元。如图 5.14 所示,左侧为这些独立绘制的数据点,右侧为对应的堆叠情况。

图 5.14 堆叠布局生成器将数据点转换为堆积的数据系列,并返回一个新数据集,其中包含每个数据系列的上下边界。图为 1986 年的示例数据。

【图 5.14 堆叠布局生成器将数据点转换为堆积的数据系列,并返回一个新数据集,其中包含每个数据系列的上下边界。图为 1986 年的示例数据。】

在使用堆叠布局时,我们创建的是一组 “数据列(data columns)” 而不是 “数据点(data points)”。每一列都对应一对上下边界值。如果堆积图形是由黑胶唱片开始的,那么下边界就为 0,上边界即黑胶唱片当年的销售额 $2,825M;然后再将磁带的销售额叠上去:下边界对应黑胶唱片的上边界(即 $2,825M),而上边界为黑胶唱片与磁带销售额的总和(即 $8,655M)。同理,该上边界值又成为 CD 唱片的下边界,而 CD 的上边界即为三种格式的销售总额(即 $10,825M)。这些边界值都能通过新数据集的索引下标进行访问(即 d[0]d[1])。

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

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

相关文章

自建私有云相册:Docker一键部署Immich,照片视频备份利器

自建私有云相册:Docker一键部署Immich,照片视频备份利器 前言 随着人们手机、PC、平板等电子产品多样,我们拍摄和保存的照片和视频数量也在不断增加。如何高效地管理和备份这些珍贵的记忆成为了一个重要的问题。 传统的云备份虽然方便&…

[微服务] - MQ高级

在昨天的练习作业中,我们改造了余额支付功能,在支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。 但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单…

【Unity3D】A*寻路(2D究极简单版)

运行后点击透明格子empty即执行从(0,0)起点到点击为止终点(测试是(5,5))如下图 UICamera深度要比MainCamera大,Clear Flags:Depth only,正交视野 MainCamera保持原样;注意Line绘线物体的位置大小旋转信息,不…

xadmin后台首页增加一个导入数据按钮

xadmin后台首页增加一个导入数据按钮 效果 流程 1、在添加小组件中添加一个html页面 2、写入html代码 3、在urls.py添加导入数据路由 4、在views.py中添加响应函数html代码 <!DOCTYPE html> <html lang

压敏电阻MOV选型【EMC】

左侧的压敏电阻用来防护差模干扰&#xff1b;右侧并联在L N 两端的压敏电阻是用来防护共模干扰&#xff1a; 选择压敏电阻时&#xff0c;通常需要考虑以下几个关键因素&#xff0c;以确保它能够有效保护电路免受浪涌电流或过电压的损害&#xff0c;同时满足 EMC 要求&#xff1…

pycharm pytorch tensor张量可视化,view as array

Evaluate Expression 调试过程中&#xff0c;需要查看比如attn_weight 张量tensor的值。 方法一&#xff1a;attn_weight.detach().numpy(),view as array 方法二&#xff1a;attn_weight.cpu().numpy(),view as array

log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件

文章目录 一、DefaultRolloverStrategy1.1、DefaultRolloverStrategy节点1.1.1、filePattern属性1.1.2、DefaultRolloverStrategy删除原理 1.2、Delete节点1.2.1、maxDepth属性 二、知识扩展2.1、DefaultRolloverStrategy与Delete会冲突吗&#xff1f;2.1.1、场景一&#xff1a…

设计模式之访问者模式:一楼千面 各有玄机

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、访问者模式概述 \quad 江湖中有一个传说&#xff1a;在遥远的东方&#xff0c;有一座神秘的玉楼。每当武林中人来访&#xff0c;楼中的各个房…

结合实例来聊聊UDS诊断中的0x2F服务

1、什么是UDS中的0x2F服务 0x2F简单来说&#xff0c;就是输入输出控制服务。先看官方的简绍 翻译如下&#xff1a; InputOutputControlByldentifier服务来替换输入信号、内部服务器函数和/或强制控制为电子系统的输出&#xff08;执行器&#xff09;的值。通常&#xff0c;此…

1月第二讲:WxPython跨平台开发框架之图标选择界面

1、图标分类介绍 这里图标我们分为两类&#xff0c;一类是wxPython内置的图标资源&#xff0c;以wx.Art_开始。wx.ART_ 是 wxPython 提供的艺术资源&#xff08;Art Resource&#xff09;常量&#xff0c;用于在界面中快速访问通用的图标或位图资源。这些资源可以通过 wx.ArtP…

【弱监督视频异常检测】2024-TCSVT-基于片段间特征相似度的多尺度时间 MLP 弱监督视频异常检测

2024-TCSVT-Inter-clip Feature Similarity based Weakly Supervised Video Anomaly Detection via Multi-scale Temporal MLP 基于片段间特征相似度的多尺度时间 MLP 弱监督视频异常检测摘要1. 引言2. 相关工作A. 分布外检测B. 弱监督视频异常检测C. 多层感知器 3. 方法A. 概述…

C# OpenCV机器视觉:凸包检测

在一个看似平常却又暗藏玄机的午后&#xff0c;阿强正悠闲地坐在实验室里&#xff0c;翘着二郎腿&#xff0c;哼着小曲儿&#xff0c;美滋滋地品尝着手中那杯热气腾腾的咖啡&#xff0c;仿佛整个世界都与他无关。突然&#xff0c;实验室的门 “砰” 的一声被撞开&#xff0c;小…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-44

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

8.若依系统监控与定时任务

帮助开发者和运维快速了解应用程序的性能状态。 数据监控 定时任务 实现动态管理任务。 需求&#xff1a;每间隔5s&#xff0c;控制台输出系统时间。 新建的任务类必须在指定目录ruoyi-quartz模块下的task包下。 状态设置为启动 执行策略 场景&#xff1a;比如一个任务每个…

【JAVA高级篇教学】第六篇:Springboot实现WebSocket

在 Spring Boot 中对接 WebSocket 是一个常见的场景&#xff0c;通常用于实现实时通信。以下是一个完整的 WebSocket 集成步骤&#xff0c;包括服务端和客户端的实现。本期做个简单的测试用例。 目录 一、WebSocket 简介 1. 什么是 WebSocket&#xff1f; 2. WebSocket 的特…

【YOLO 项目实战】(12)红外/可见光多模态目标检测

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【YOLO 项目实战】&#xff08;10&#xff09;YOLO8 环境配置与推理检测 【YOLO 项目实战】&#xff08;11&#xff09;YOLO8 数据集与模型训练 【YOLO 项目实战】&#xff08;12&#xff09;红外/可…

Ubuntu开机The root filesystem on /dev/sdbx requires a manual fsck 问题

出现“Manual fsck”错误可能由以下几种原因引起&#xff1a; 不正常关机&#xff1a;如果系统意外断电或被强制重启&#xff0c;文件系统可能未能正确卸载&#xff0c;导致文件系统损坏。磁盘故障&#xff1a;硬盘的物理损坏可能会引发文件系统错误。文件系统配置问题&#x…

RFSOC 47dr Dp口测试(ARM裸机)

47DR 内核还是一个4核A53的MPSOC&#xff0c;测试方式和MPSOC一样 首先设置好BD文件 编译好BIT设置VITIS工程 examle工程测试即可 但是本人硬件会跑飞不知道为何&#xff0c;通过注释掉下图的子函数得以解决 值得注意的是&#xff0c;最好用HP的线&#xff0c;不要用DP转…

protobuf: 通讯录2.1

先引入需要知道的proto3语法&#xff1a; 1.proto3 1.hexdump 作用&#xff1a; hexdump&#xff1a;是Linux下的⼀个⼆进制⽂件查看⼯具&#xff0c;它可以将⼆进制⽂件转换为ASCII、⼋进制、 ⼗进制、⼗六进制格式进⾏查看。 -C: 表⽰每个字节显⽰为16进制和相应的ASCI…

电子应用设计方案81:智能AI冲奶瓶系统设计

智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务&#xff0c;特别是在夜间或忙碌时&#xff0c;减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例&#xff0c;满足不同年龄段婴…