【D3.js in Action 3 精译_022】3.2 使用 D3 完成数据准备工作

当前内容所在位置

  • 第一部分 D3.js 基础知识
    • 第一章 D3.js 简介(已完结)
      • 1.1 何为 D3.js?
      • 1.2 D3 生态系统——入门须知
      • 1.3 数据可视化最佳实践(上)
      • 1.3 数据可视化最佳实践(下)
      • 1.4 本章小结
    • 第二章 DOM 的操作方法(已完结)
      • 2.1 第一个 D3 可视化图表
      • 2.2 环境准备
      • 2.3 用 D3 选中页面元素
      • 2.4 向选择集添加元素
      • 2.5 用 D3 设置与修改元素属性
      • 2.6 用 D3 设置与修改元素样式
      • 2.7 本章小结
    • 第三章 数据的处理 ✔️
      • 3.1 理解数据
      • 3.2 准备数据 ✔️
        • 3.2.1 将数据集加载到 D3 项目 ✔️
        • 3.2.2 格式化数据 ✔️
        • 3.2.3 测量数据集 ✔️
      • 3.3 将数据绑定到 DOM 元素(精译中 ⏳)
      • 3.4 让数据适应屏幕
      • 3.5 加注图表标签
      • 3.6 本章小结

文章目录

    • 3.2 数据准备 Preparing data
      • 3.2.1 将数据集加载到 D3 项目 Loading a dataset into a D3 project
      • 3.2.2 格式化数据 Formatting a dataset
      • 3.2.3 测量数据集 Measuring a dataset

3.2 数据准备 Preparing data

有了数据集,下一步就是用 D3 将其 加载 到项目中,如图 3.8 中的步骤 2 所示。然后就是确保数据按正确的格式进行处理,其间也可能需要对数据进行多方位的测量。本节介绍的 D3 方法都是为了完成上述准备工作,并为示例条形图的创建提供有效数据。

图 3.8 D3 数据工作流的第二步即利用 D3 的数据获取方法,将数据集加载到项目中

图 3.8 D3 数据工作流的第二步即利用 D3 的数据获取方法,将数据集加载到项目中

3.2.1 将数据集加载到 D3 项目 Loading a dataset into a D3 project

D3 提供了极为方便的工具函数来处理项目数据的加载。具体工具函数的选择,取决于当前数据集的特定格式。例如,CSV 格式的数据集使用 d3.csv() 进行加载,JSON 数据集则使用 d3.json()。这些函数的第一个参数均为该数据文件的路径。此外,D3 还专门提供了用于加载文本甚至 XML 格式数据的工具函数。它们都分属 d3-fetch 模块(详见 https://d3js.org/d3-fetch)。

注意

本章代码已放到 GitHub 仓库(详见 http://mng.bz/Y7Po)。各章节代码都存放在代码仓库相应的文件夹下。在 3.2 开头的文件夹中可以看到本小节示例代码,数字后跟章节主题,如 3.2-Preparing_data。各文件夹下都有一组子文件夹 startend。若需从最基本的代码开始练习,请使用 start 文件夹。要是遇到困难,可以在 end 文件夹找到对应的参考代码。分章节练习时,建议一次只打开一个 start 或一个 end 文件夹。如果用 Live Server 工具一次性打开所有章节的文件并启动本地服务器,某些路径可能无法正常工作,尤其是往项目中加载数据集时,需要特别注意。

下面再回到上一章介绍过的那个条形图练习,将我们从《2021 年数据可视化行业状态调查》中搜集的样本数据集(详见 www.datavisualizationsociety.org/survey)加载到示例中。该数据集为 CSV 格式,位于 /data 文件夹下。数据集的具体内容如代码清单 3.1 所示。第一行为列标题,technologycount 分别表示调查中涉及的数据可视化工具(即从 ArcGISP5)、以及选用该工具的从业者投票数。其中 D3.js 为 414 票,Python 为 530 票:

代码清单 3.1 数据从业人员最常用的工具统计情况(data.csv)

technology,count
ArcGIS,147
D3.js,414
Angular,20
Datawrapper,171
Excel,1078
Flourish,198
ggplot2,435
Gephi,71
Google Data Studio,176
Highcharts,58
Illustrator,426
Java,29
Leaflet,134
Mapbox,167
kepler.gl,24
Observable,157
Plotly,223
Power BI,460
PowerPoint,681
Python,530
QGIS,193
Qlik,61
R,561
React,145
Tableau,852
Vega,48
Vue,51
Web Components,79
WebGL,65
Pen & paper,522
Physical materials,69
Canvas,121
P5/Processing,55

鉴于目标数据集为 CSV 文件,因此选用 d3.csv() 进行数据加载,并将文件路径 "../data/data.csv" 作为第一参数。这里的双句点符号 .. 表示上一层目录,即文件夹 /js 所在的项目根目录。然后进入 /data 文件夹,最终定位到数据文件 data.csv

d3.csv("../data/data.csv");

这样就完成了数据工作流中的第 2 步。接下来需要对数据做格式化处理并完成相关测量工作。在此之前,还要知道数据的访问方法。注意,这里的数据加载是一个 异步过程(asynchronous process,所涉及的异步操作,是指那些数据结果不会立即返回的数据请求。我们可以通过访问 d3.csv() 的回调函数,或者 JavaScriptPromise 接口,确保数据在执行相关操作前已加载完毕。

3.2.2 格式化数据 Formatting a dataset

本节介绍 D3 处理数据格式的具体方法,对应工作流中的第三步,如图 3.9 所示:

图 3.9 数据工作流的第三步,从数据格式化开始,以便在构建可视化时使用

图 3.9 数据工作流的第三步,从数据格式化开始,以便在构建可视化时使用

d3.csv() 中的回调函数,又称为 行转换函数(row conversion function),能够逐行访问数据。在下面的代码中,d3.csv() 的第一个参数为数据路径,第二个参数即为回调函数。该函数将访问到的数据输出到控制台显示。复制本段代码到 main.js 并保存项目:

const svg = d3.select(".responsive-svg-container").append("svg").attr("viewBox", "0 0 1200 1600").style("border", "1px solid black");d3.csv("../data/data.csv", d => {console.log(d);
});

打开浏览器检查工具,转到控制台(即 Console)标签,将会看到如图 3.10 所示的输出结果。数据逐行记录,每一行都是一个包含 technologycountJavaScript 对象:

图 3.10 获取到数据后,由 d3.csv() 回调函数输出到控制台的部分数据显示情况

图 3.10 获取到数据后,由 d3.csv() 回调函数输出到控制台的部分数据显示情况

d3.csv("../data/data.csv", d => {return {technology: d.technology,count: +d.count};
});

这里的关键在于,回调函数中返回的这些键值对(key-value pairs),是数据集加载完毕后唯一可以访问的内容。该策略可以有效过滤原始数据中的无关字段列。但如果需要保留的列过多,逐一返回目标键值对可能稍显冗余。这时可能需要跳过回调函数中的处理逻辑,待 D3 返回完整数据集后再统一进行格式化。完整数据集的具体访问方法将在下一节进行介绍。

3.2.3 测量数据集 Measuring a dataset

D3 数据工作流的第三步还可以包含一个可选操作,即数据测量,如图 3.11 所示。尽管逐行读取数据很实用,但有时也需要访问整个数据集。这就要用到 JavaScript 的期约接口 Promise 了。Promise 是异步操作的结果,并以对象的形式存在。例如函数 d3.csv() 返回的对象。读取 Promise 结果的一个简单方法是调用其 then() 方法。

图 3.11 在第三步的第二小步,可以测量并探索数据

图 3.11 在第三步的第二小步,可以测量并探索数据

在以下代码段中,工具函数 d3.csv() 链式调用了 then() 方法。一旦数据加载完毕,Promise 即转为 兑现(fulfilled) 状态,完整数据集将在 then() 方法中的回调函数中备用。按如下代码将该数据集一次性输出到控制台,并保存项目:

d3.csv("../data/data.csv", d => {return {technology: d.technology,count: +d.count};
}).then(data => {console.log(data);
});

在控制台中,您会看到一个被转换为对象数组的完整数据集,其中的每个对象对应 CSV 原始数据集中的某一行。此时 D3 让该数据集变为可迭代对象,对于后续可视化开发非常有用。如图 3.12 所示,还可以确认计数值已正确转为数字形式。查看数组最后一项,还能看到经过 D3 处理后的原始 CSV 数据的列标题数组。尽管我们的条形图小练习暂不需要,但它偶尔也可以派上用场。

图 3.12 完整的数据集以对象数组的形式记录在控制台中

图 3.12 完整的数据集以对象数组的形式记录在控制台中

在数据工作流的第 3.a 步骤中,我们已经完成了数据格式化的工作,此时仍然可以利用 D3 来探索并测量获取到的数据。测量数据的特定维度有助于提前做好相关准备工作。

虽然从何处开始探索数据并没有严格的规范,但从数据集 Promise 的 then() 方法切入不失为一个好思路。首先要考察数据集包含了多少种技术。这可以通过数组的 length 属性直接查看。打印到控制台,将得到结果 33。也就是说,条形图将包含 33 个矩形元素:

d3.csv("../data/data.csv", d => {...
}).then(data => {console.log(data.length);   // => 33(数据集包含的总行数)
});

此外,我们还想知道哪种技术最受欢迎,以及有多少从业人员在定期使用它;最热门的有了,最冷门的情况又如何?这些指标都可以通过 d3.max()d3.min() 函数获得。如以下代码段所示,这些函数都接受两个参数:第一个参数是包含这些极值的可迭代对象(即数据集本身),由 Promise 提供;第二个参数是一个 访问器函数(accessor function),用于指定参与比较的健(本例中即为 count)。

若要在控制台中分别输出最大值和最小值,同样可利用 Promisethen() 方法,分别得到结果 107820

d3.max(data, d => d.count)      // => 1078
d3.min(data, d => d.count)      // => 20
d3.extent(data, d => d.count)   // => [20, 1078]

注意

还可以使用 d3.extent() 方法,它接受相同的参数并返回一个包含最小值和最大值的结果数组。

考察数据中的最大值与最小值有助于预判图表中条形区域的长度,并能预估最高值和最低值之间的差异对比是否易于在屏幕上渲染。

条形图中的数据常按降序排列,这样可读性更强,观众看了也能一目了然,明确哪些技术使用频率较高、哪些较低。JavaScript 的原生方法 sort() 可以轻松实现排序。它接受一个 比较函数(compare function) 作参数,如以下代码所示。该函数用于比较两个技术的 count 值,参数 a 和参数 b 分别表示参与比较的两个技术对象。若 b 中的 count 值大于 a 中的,则 b 应该排在 a 的前面,以此类推:

data.sort((a, b) => b.count - a.count);

排序逻辑可以放到 then() 方法内。如果打印到控制台,会看到 Excel 位于技术列表的首位,计数为 1078;其次是 Tableau,计数值 852Angular 则以 20 的最小计数值垫底,如图 3.13 所示。

此外,d3-array 模块(详见 https://d3js.org/d3-array)还包含大量用来测量及转换数据的实用方法,本书后续将选取一部分进行介绍。但 d3.max()d3.min()d3.extent() 函数应该这当中是最常用的。

图 3.13 输出到控制台并按降序排列的数据集

图 3.13 输出到控制台并按降序排列的数据集

完成了数据的加载、转换与测量工作,接下来通常需要将数据集传递给另一个函数进行处理。该函数负责可视化效果的构建。如以下代码段所示,可以看到此时 main.js 中的内容;注意观察在 then() 方法的末尾,数据是怎样传递给 createViz() 函数的。该函数的实现逻辑将在下一节进行介绍。

代码清单 3.2 数据的加载、转换与测量逻辑(main.js)

const svg = d3.select(".responsive-svg-container").append("svg")  // 添加一个 SVG 容器.attr("viewBox", "0 0 1200 1600")     .style("border", "1px solid black");  d3.csv("../data/data.csv", d => { // 加载数据集// 对数据进行格式化处理return {technology: d.technology,  count: +d.count            };
}).then(data => {// 对数据集进行测量console.log(data.length); // => 33console.log(d3.max(data, d => d.count)); // => 1078         console.log(d3.min(data, d => d.count)); // => 20          console.log(d3.extent(data, d => d.count)); // => [20, 1078]// 让数据集按降序排列data.sort((a, b) => b.count - a.count);// 将数据集传给另一个函数作进一步处理createViz(data);
});// 构建条形图的处理函数
const createViz = (data) => {};

在结束本节内容前,您可以参照图 3.14 中的内容,简要回顾一下前面学过的数据加载、行转换以及 Promise 等相关概念。总结归纳如下:

  1. 加载数据要用到 D3 的数据获取函数(fetch function),如 d3.csv()
  2. 数据的格式化是在行转换函数中进行的。
  3. 数据加载完毕后,可以通过链式调用 then() 方法来访问整个数据集。该方法也是探究数据及执行其他数据操作的理想场所。
  4. 将最终的数据传递给另一个函数,由该函数负责具体的可视化构建。

图 3.14 D3 中数据加载、转换及测量的实现方法与位置示意图

图 3.14 D3 中数据加载、转换及测量的实现方法与位置示意图

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

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

相关文章

【网络原理】❤️Tcp 常用机制❤️ —— 延时应答,捎带应答, 面向字节流, 异常情况处理。保姆式详解 , 建议收藏 !!!

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

[数据集][目标检测]无人机识别检测数据集VOC+YOLO格式6986张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6986 标注数量(xml文件个数):6986 标注数量(txt文件个数):6986 标注…

‌内网穿透技术‌总结

内网穿透是一种网络技术,通过它可以使外部网络用户访问内部网络中的设备和服务。一般情况下,内网是无法直接访问的,因为它位于一个封闭的局域网中,无法从外部访问。而通过内网穿透,可以将内部网络中的设备和服务暴露在…

数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例

时间序列概况在日常生活和专业研究中都很常见。简而言之,时间序列概况是一系列连续的数据点 y(0), y(1), …, y(t) ,其中时间 t 的点依赖于时间 t-1 的前一个点(或更早的时间点)。 在许多应用中,研究者致力于预测时间序列概况的未来行为。存在各种建模方法。这些模型通常基于过…

Unity让摄像机跟随物体的方法(不借助父子关系)

在Unity中,不使用子对象的方式让相机跟随物体移动,我们通过编写脚本来实现。下面放一个从工程中摘出来的的C#脚本示例,用于将相机绑定到一个Target对象上并跟随其移动: using UnityEngine; public class FollowCamera : MonoBeh…

DPDK基础入门(十):虚拟化

I/O虚拟化 全虚拟化:宿主机截获客户机对I/O设备的访问请求,然后通过软件模拟真实的硬件。这种方式对客户机而言非常透明,无需考虑底层硬件的情况,不需要修改操作系统。 半虚拟化:通过前端驱动/后端驱动模拟实现I/O虚拟…

【STM32】CAN总线基础入门

CAN总线基础入门 一、CAN简介二、主流通信协议对比三、CAN物理层1、CAN硬件电路2、CAN电平标准3、CAN收发器 – TJA1050(高速CAN)4、CAN物理层特性 四、帧格式1、CAN总线帧格式2、数据帧3、数据帧各部分用途简介4、数据帧的发展历…

大模型参数高效微调技术原理综述(八)-MAM Adapter、UniPELT

MAM Adapter 背景 近年来提出了多种参数高效的迁移学习方法,这些方法仅微调少量(额外)参数即可获得强大的性能。虽然有效,但人们对为什么有效的关键要素以及各种高效微调方法之间的联系知之甚少。 下图展示了不同的微调方法&am…

小米,B站网络安全岗位笔试题目+答案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

坚持的力量--完成向CSDN迁移500篇技术文章阶段小记-以此自勉

前言:本文为迁移前的博客中的文章《坚持的力量-写给第1000篇文章笔记》发表于 publish:May 14, 2021 -Friday,作为原个人博客中累计写满1000篇文章的总结和鼓励。因在向CSDN迁移文章的过程中进行了一些文章合并等调整,总文数大量下降&#xf…

ACM模式下算法题输入输出攻略【C++】

文章目录 [TOC] 1. 核心代码模式与ACM模式1.1 ACM模式介绍1.2 注意事项 2. C常用的输入输出方法2.1 输入2.1.1 cin注意事项2.1.2 getline()注意事项2.1.3 getchar()注意事项 2.2 输出 3. 案例3.1 一维数组输入3.1.1 固定长度的一维数组3.1.2 不固定长度的一维数组 3.2 二维数组…

使用ddns-go实现自动配置IPv6的DDNS

正文共:888 字 17 图,预估阅读时间:1 分钟 前面说到通过PPPoE拨号获取到的IPv6地址没有发生变化(企业路由器配置IPv6家用宽带的PPPoE拨号示例),结果说完就打脸了。中间家里停了一次电,路由器重新…

Transformer模型详细步骤

Transformer模型是nlp任务中不能绕开的学习任务,我将从数据开始,每一步骤都列举出来,然后对应重点的代码进行讲解 ------------------------------------------------------------------------------------------------------------- Trans…

物品识别——基于python语言

目录 1.物品识别 2.模型介绍 3.文件框架 4.代码示例 4.1 camera.py 4.2 interaction.py 4.3 object_detection.py 4.4 main.py 4.5 运行结果 5.总结 1.物品识别 该项目使用Python,OpenCV进行图像捕捉,进行物品识别。我们将使用YOLO&#xff08…

re题(23)BUUFCTF-[FlareOn4]login

BUUCTF在线评测 (buuoj.cn) 下载后打开看到是一个txt和一个html 分别打开看看,txt是提示,html应该就是要破解的网页 打开网页,查看源代码 找到程序,变灰的部分是关键,是指如果是前13个字母就加13,如果是…

小程序开发设计-第一个小程序:注册小程序开发账号②

上一篇文章导航: 小程序开发设计-小程序简介①-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142217803?sharetypeblogdetail&sharerId142217803&sharereferPC&sharesourceqq_60872637&spm1011.2480.3001.8118 须知:不…

C++设计模式——Prototype Pattern原型模式

一,原型模式的定义 原型模式是一种创建型设计模式,它允许通过克隆已有对象来创建新对象,从而无需调用显式的实例化过程。 原型模式的设计,使得它可以创建一个与原型对象相同或类似的新对象,同时又可以减少对象实例化…

Rust Windows下编译 静态链接VCRuntime140.dll

Rust 编译出来的exe默认动态链接VC运行库,分发电脑上需要安装有Microsoft Visual C Redistributable for Visual Studio 2015运行库。 编译时能静态链接进去,就省去客户端未安装运行库的问题。方法如下: 只需在当前根目录下新建.cargo\config.toml&#…

【可视化大屏系列】数据列表自动滚动效果

要实现列表的自动滚动效果,这里提供两种解决方案: 1.vue插件 官方文档:链接: vue-seamless-scroll (1)安装依赖 npm install vue-seamless-scroll --save(2)全局注册(main.js中&a…

【CTF Web】BUUCTF BUU UPLOAD COURSE 1 Writeup(文件上传+PHP+文件包含漏洞)

BUU UPLOAD COURSE 1 1 上课用~ 点击启动靶机。 解法 疑似存在文件包含漏洞。 http://15a5666e-1796-4f76-b892-0b69cf97df8e.node5.buuoj.cn:81/index.php?fileupload.php查看网页源代码。判断是后端检查。 <!DOCTYPE html> <html lang"zh-cn"> &…