首页 > 其他分享 >【D3.js in Action 3 精译_032】第四章 D3 直线、曲线与弧线的绘制 + 4.1 坐标轴的创建(上)

【D3.js in Action 3 精译_032】第四章 D3 直线、曲线与弧线的绘制 + 4.1 坐标轴的创建(上)

时间:2024-10-09 23:19:06浏览次数:12  
标签:4.1 数据 精译 d3 可视化 csv data 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.3 将数据绑定到 DOM 元素
        • 3.3.1 利用数据给 DOM 属性动态赋值
      • 3.4 让数据适应屏幕
        • 3.4.1 比例尺简介(上篇)
        • 3.4.2 线性比例尺(中篇)
          • 3.4.2.1 基于 Mocha 测试 D3 线性比例尺(DIY 实战)
        • 3.4.3 分段比例尺(下篇)
          • 3.4.3.1 使用 Observable 在线绘制 D3 条形图(DIY 实战)
      • 3.5 加注图表标签(上篇)
        • 3.5.1 人物专访:Krisztina Szűcs(下篇)
      • 3.6 本章小结
    • 第四章 直线、曲线与弧线的绘制 ✔️
      • 4.1 坐标轴的创建(上篇) ✔️
        • 4.1.1 D3 中的边距约定(精译中 ⏳)
        • 4.1.2 坐标轴的生成
      • 4.2 D3 折线图的绘制

文章目录

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

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

译者按
从今天开始进入全新的第四章学习。前面条形图还不熟练的朋友最好根据上面给出的完整目录查漏补缺,以免影响后续的正常学习。一切就绪后,就可以随我一起来看看,这一章作者又将带领大家完成一个什么样的 D3 实战项目。

第四章 直线、曲线与弧线的绘制 Drawing lines, curves, and arcs

本章概要

  • 图表轴线的添加与边距约定的应用
  • 使用直线生成器函数绘制线形图
  • 利用数据点插值将直线变为曲线
  • 使用面积生成工具绘制面积图
  • 使用圆弧生成工具创建弧线

想必您已经熟悉了数据可视化中常见的 SVG 图形:直线(line)、矩形(rectangle)和圆(circle);并且还能从零开始利用矩形来绘制一个条形图。然而,这些基本图元所能绘制的作品毕竟有限;为了实现更复杂的可视化效果,人们通常会使用 SVG 路径(path)。正如本书第一章介绍的那样,SVG 的路径元素是所有 SVG 元素中灵活性最高的,几乎可以实现任何形式的渲染效果。因而它在 D3 项目中的应用也极为广泛,其中最简单的一类便是直线和曲线的绘制,或者在环形图中创建圆弧。

SVG 路径元素的形状是由它的 d 属性决定的。该属性由一组指令组成,它们描述了路径元素的起点与终点、变向时的曲线类型、路径是开口的还是封闭的等等。这些因素可能会让 d 属性写得很长,复杂度也会随之迅速攀升。通常情况下,该属性值都不会让开发人员亲自来写,而是交给 D3 的图形生成工具(shape generator)去实现。

本章将构建如图 4.1 所示的可视化项目——一个与温度变化趋势相关的线形图,以及反映 2021 年纽约降水天数占比情况的一组可视化弧线图。您可以查看该项目的线上版,网址为:http://mng.bz/5orB;项目数据则来自 Weather Underground 网站(www.wunderground.com1

图 4.1 本章实现项目:2021 年纽约市温度变化及全年降水天数占比情况可视化

【图 4.1 本章实现项目:2021 年纽约市温度变化及全年降水天数占比情况可视化】

本章将利用 D3 的图形生成函数来创建这两种可视化效果。首先来了解一下 D3 的边距约定(margin convention)以及给图表添加坐标轴的相关知识。

4.1 坐标轴的创建 Creating axes

开发一个数据可视化项目通常需要对 SVG 容器中的可用空间进行合理规划。您可能一上来就忍不住想要实现一些酷炫的特效作为可视化项目的核心内容,但是,相信我,在此之前稍加准备将为您省出不少的创作时间——不光可视化开发如此,所有的编程任务乃至生活中的方方面也是如此!在规划阶段,不仅要考虑图表本身,还要考虑那些有助于让图表一目了然的辅助因素,比如坐标轴、数据标签、图例等等。

本节将介绍边距约定的相关知识,旨在对这些不同要素的空间分配情况进行合理规划。之后会介绍一些方法来给 D3 图表添加坐标轴,并进一步了解构成 D3 坐标轴的相关 SVG 元素。这些知识最终都将应用到上面的图 4.1 所示的折线图中。

正式开始之前,请先准备好本章的源码文件。如果还没有下载,可以从本书的 GitHub 仓库进行下载(http://mng.bz/Xqjv2。代码都在 chapter_04 文件夹中,已按章节进行组织,练习本章内容,请在您的代码编辑器中打开 4.1-Margin_convention_and_axes/start 文件夹,并启动本地 Web 服务器。本地开发环境的设置方法,请参考 附录 A(译注:待翻译,推荐使用 VSCode 的 Live Server 插件快速初始化)。您也可以在本章源码根目录下的 README 文件中找到更多与本项目文件夹结构相关的详细介绍。

重要提醒

在使用本章代码进行同步练习时,请务必记得让代码编辑器要么只打开一个 start 文件夹,要么只打开一个 end 文件夹。如果将本章所有示例代码视为同一个项目,并通过 Live Server 扩展插件来搭建本地服务器环境,则项目启动时引用的数据文件路径将会失效。

项目代码将写在 line-chart.js 文件中。首先利用 d3.csv() 方法加载每周气温数据集:

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

上一章介绍过,D3 加载表格类数据集时执行的类型转换(type conversion)可能会影响值的类型。要是数据集中的数字转成了字符串,则需要改回数字类型以便后续操作。我们也学过,d3.csv() 的回调函数由于可以逐行访问数据,正是处理类型问题的理想场所。本节再介绍一个不用在回调里手动转换类型的小技巧:在回调函数的位置调用 d3.autoType 方法。该函数能够检测日期、数字等常见的数据类型,并将其自动转换成相应的 JavaScript 类型:

d3.csv("../data/weekly_temperature.csv", d3.autoType);

值得注意的是,d3.autoType 可能会由于数据类型的不确定性而出错。例如一个四位数 2023,既可以是数字类型,也可能是日期型。这是 d3.autoType 会按数字进行转换,而您却希望按日期解析。因此有必要在数据加载完毕后进行双重验证。更多详细,可以参考发表在 Observable 上的一篇写得很棒的文章:https://observablehq.com/@d3/d3-autotype

为此,可以继续使用 JavaScriptPromise 来访问加载的数据集,然后将其输出到控制台,以确认日期都正确转成了 JavaScript 日期格式,而气温值则转成了数字,如图 4.2 所示:

d3.csv("../data/weekly_temperature.csv", d3.autoType).then(data => {
  console.log("temperature data", data);
});

图 4.2 得益于 d3.autoType,日期和气温都转换成了正确的数据类型

【图 4.2 得益于 d3.autoType,日期和气温都转换成了正确的数据类型】

由于数据加载是个异步过程(D3 加载并访问数据的具体方法,详见第三章有关内容),这里仍然选用 JavaScriptPromise 接口来访问数据集。确认格式无误后,就可以开始本章图表的构建了。

line-chart.js 文件已经包含了一个名为 drawLineChart() 的函数,创建折线图的代码就将写到那儿。按以下代码的写法,在 JavaScriptPromise 回调函数中调用 drawLineChart() 方法,并将数据集传入该方法:

d3.csv("../data/weekly_temperature.csv", d3.autoType).then(data => {
  console.log("temperature data", data);
  drawLineChart(data);
});

上述工作一切就绪后,接下来就正式开始边距约定(margin convention)相关的学习。

(上篇完)


  1. Weather Underground 是美国一家提供实时天气数据和详细天气预报的在线平台,由 Jeff Masters 和其他气象爱好者于 1995 年创建,总部位于美国加州旧金山,依托于大量私人气象站,用户可以获得准确的地方性天气信息和恶劣天气警报,同时支持社区参与,鼓励用户分享天气数据。 ↩︎

  2. 本章要用到的源码我会上传到 CSDN,方便大家在本地同步练习。 ↩︎

标签:4.1,数据,精译,d3,可视化,csv,data,D3
From: https://blog.csdn.net/frgod/article/details/142798277

相关文章

  • 【笔记】杂题选讲 2024.10.5(DNF)
    十一杂题选讲-VirtualJudge(vjudge.net)/mnt/e/codes/contests/20241008/sol.md目录[AGC004F]Namori[1406E]DeletingNumbers[1081G]MergesortStrikesBack[1033E]HiddenBipartiteGraph[1254E]SendTreetoCharlie[1012E]Cyclesort[1284F]NewYearandSocialN......
  • 2024.10.9 LGJ Round
    B对于所有\(x\in[0,n],y\in[0,m]\),求执行\(x\getsx+y,y\getsx+y\)若干次后满足\(x=k\)的双元组个数。这个题充分体现我的唐氏。具体地枚举\(x,y\)分别被算了多少次,系数是斐波那契数列,所以项数很少。然后转化为求\(k_1x+k_2y=k\)的方案数,这个我非常唐不会求。只需......
  • 2024.10.9训练记录
    下午提高组模拟省流:又被lyy吊打了晚上订正A神秘猜结论题,场上少猜了一点挂了\(18\)分,遗憾。结论:\(ans\in[0,3]\)\(0/1\)可以直接判。\(1\)的情况就是存在一个前缀\(a_{1,i}\)满足出现的数是\(1\)到\(i\)。\(3\)的情况仅当\(a_1=n\)且\(a_n=1\)。场上......
  • 鲲鹏(arm64)+麒麟V10离线部署KubeSphere3.4.1(精简版 离线包Windows制作)
    前提条件Windows上安装DockerDesktop+WSL。麒麟V10k8s系统初始化的依赖已下载(若没下载过,可参考上篇至鲲鹏麒麟服务器下载或Windows手动下载)Windows手动下载,地址:https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/aarch64/Packages/开始制作2.......
  • 2024.10.09 力扣刷题 盛水最多的容器
    题目:这边是参考了B站UP主的思路进行了解答,采用双下标访问的方式进行。如果要水最多的话,一定是高的那端找低的那端,然后算出面积。如果是低的那端找高的那端,那本身下限就在自己身上,所以不从低的端固定不变。附上代码:intmaxArea(std::vector<int>&height){ if(height.empty......
  • 2024.10.9 总结
    决定以后分开写,显的博客多。A:首先考虑对给定树计算权值,假设我们已经知道了一个权值最小的划分,那么可以通过调整得到新的划分使得权值不变,目的是简化虚树的形态。考虑该划分中任意一个集合形成的虚树,有两种情况:如果根节点\(r\)存在于任何一个最大独立集中,即\(f_{r,1}>f_{r,0}......
  • 24.10.09
    哈哈写总结最早一天。改不动根本改不动。NOIp模拟赛放三道神秘题不知道出题人是不是考过这种NOIp哈哈。A根据猜结论(并通过大样例验证)可以得到划分的每组点要么是祖先-后代点对,要么是孤点。每组代价是\(1\)。然后简单dp是设\(f_x\)表示\(x\)子树内最少的孤点。\[f_x......
  • 【test】2024.10.8
    次大值思路发现性质,对于一个数\[a[i]\%a[j]\lea[i]\]当他取得最大值时\(a[i]<a[j]\)于是对于前&n-1&大的数,他的贡献值就是他本身,所以我们只需要保存第\(n-1\),\(n-2\)大的数就可以。但是此时要注意第\(n\)大的数的贡献值没有计算,由于\(a[n]\%a[n-2]<a[n-2]\),所以如果他要......
  • d3drm.dll文件丢失修复指南:恢复游戏和软件正常运行
    d3drm.dll是DirectX3DRetainedMode(Direct3D保留模式)的一部分,这种模式在较旧的DirectX版本中使用。如果你遇到这个DLL文件缺失的问题,可以尝试以下几种方法来解决:重新安装或更新DirectX修复工具:访问微软官方网站下载并安装最新的DirectX修复工具。如果你运行的是较老的游......
  • D30【python 接口自动化学习】- python基础之输入输出与文件操作
    day30F-strings输出学习日期:20241007学习目标:输入输出与文件操作﹣-42F-strings-如何通过定义好的格式进行输出?学习笔记:F-strings介绍F-strings的计算功能F-strings宽度和精度调整练习#宽度为10个字符,不足补0print(f'{number:010}')#000123.456#指定类......