【D3.js in Action 3 精译_025】3.4 让 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.3 分段比例尺(下篇,待翻译 ⏳)
      • 3.5 加注图表标签
      • 3.6 本章小结

文章目录

      • 3.4.2 线性比例尺 Linear scale

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

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

译者按
上篇介绍了 D3 比例尺的一些基本情况,本篇就来看看 D3 最常用的线性比例尺究竟该怎么用。

3.4.2 线性比例尺 Linear scale

开发 D3 项目最常用的比例尺,毫无疑问,就是 线性比例尺d3.scaleLinear())。该比例尺以连续的定义域作为输入,并以连续型的值域作为输出:

const myLinearScale = d3.scaleLinear().domain([0, 250]).range([0, 25]);

线性比例尺的输出与输入成正比,如图 3.24 所示。在上述代码中,定义域声明为包含 0 到 250 之间的任意值;而值域则为包含 0 到 25 之间的任意值。若以 100 为参数调用该函数,则返回 10。同理,若传入 150,则返回 15:

myLinearScale(100) => 10
myLinearScale(150) => 15

回到本章示例。前面介绍过,数据集中的计数值(count)用于设置矩形条的 width 属性。这么做固然不错,毕竟计数值不大;但更常见的做法是利用比例尺工具将数据集中的值转换为 SVG 的属性值:

图 3.24 线性比例尺的输出与输入呈线性比例关系

【图 3.24 线性比例尺的输出与输入呈线性比例关系】

const svg = d3.select(".responsive-svg-container").append("svg").attr("viewBox", "0 0 600 700")...

此外,还要在 main.css 样式表文件中修改响应式容器元素的最大宽度,即类名为 responsive-svg-containerdiv 元素属性 max-width

.responsive-svg-container {...max-width: 600px;...
}

刷新页面,会看到图表区前三个矩形条溢出了 SVG 容器。这个问题可以通过线性比例尺来解决。它可以将实际的计数值映射为 SVG 容器中可用的空间尺寸,并为图表标签预留足够的位置。

由于该比例尺函数用于将元素的大小沿 x 轴排布,因此首先声明一个常量 xScale,然后调用 d3.scaleLinear() 方法,紧接着链式调用 domain()range() 方法。

count 的取值范围,根据整理好的数据集,为 0(理论最小值)到 1,078(即对应 Excel 的得票数)。请注意,这里用的是 0 而非数据集中的实际最小值,因为与大多数图表一样,x 轴将从 0 开始绘制。因此传入 domain() 方法的参数为处理后的边界值数组(即 [0, 1078])。

接着需要计算可用的水平距离,并以此为比例尺函数的值域。前五个矩形条的显示效果如图 3.25 所示。此时您本地的页面应该看不到图中那样的左右标签,图 3.25 只是为了演示预留额外空间的必要性:

图 3.25 计算条形图可用的水平距离

【图 3.25 计算条形图可用的水平距离】

已知 SVG 容器总宽度为 600px,左侧预留 100px 用于显示“技术”(technology)标签,右侧预留 50px 用于计数(count)标签,则矩形条的长度范围介于 0 ~ 450px 之间。这样 xScale 的定义域和值域都有了。在数据绑定的代码之前、createViz() 函数的内部添加如下比例尺函数:

const createViz = (data) => {const xScale = d3.scaleLinear().domain([0, 1078]).range([0, 450]);// Data-binding...
}

前面讲过,D3 比例尺函数的用法与其他 JavaScript 函数一样,传入定义域中的某个值,则返回该值对应的值域结果。例如,传入 1078,它对应 Excel 的票数值,则函数返回 450;若传入 414,即 D3 的得票数,则返回 172.82,对应矩形条的绘制宽度(以像素为单位):

xScale(1078)   // => 450
xScale(414)    // => 172.82

您可以在控制台亲自尝试一下,传入下图给出的几个定义域取值,看看计算结果与图 3.26 给出的结果是否一致:

图 3.26 利用线性比例尺将数据集中的 count 值映射为条形图的宽度值

【图 3.26 利用线性比例尺将数据集中的 count 值映射为条形图的宽度值】

比例一旦确定,就可以用它来计算条形图中各个矩形条的宽度了。定位到设置矩形条 width 属性的那行代码,如以下代码所示,不要直接使用 count 值,而是传入一个函数,并将调用 xScale() 的结果返回;接着再将属性 x 改为 100,表示将矩形条统一右移 100px 以便绘制技术标签:

svg.selectAll("rect").data(data).join("rect")....attr("width", d => xScale(d.count))....attr("x", 100)...

最后保存项目,再次回顾条形图适应 SVG 容器尺寸的方式,以及复盘条形图两侧的标签空白的设计过程,以加深印象。

这就是 D3 线性比例尺的用法。虽然 D3 还提供了其他不同类型的比例尺工具函数,但万变不离其宗。要从一种比例尺切换到另一种,只需要知道接受的定义域是什么数据类型的,以及期望的值域范围是什么就行了。

译注
全新的第 3 版给我的感受只有一个:只要照着书中的讲解去练习,就一定能绘制出截图展示的各种效果。这对于零基础数据可视化的小伙伴来说,真是看得见摸得着的福利彩蛋!
下一篇,我们将一起学习 D3 绘制条形图需要的另一种比例尺——分段比例尺(band scale),敬请关注。

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

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

相关文章

[Python数据分析]最通俗入门Kmeans聚类分析,可视化展示附代码。

什么是k-means分析?【头条@William数据分析,看原版】 想象一下,你有一堆五颜六色的糖果,你想把它们按照颜色分成几堆。k-means分析就是这么一个自动分类的过程。它会根据糖果的颜色特征,把它们分成若干个组,每个组里的糖果颜色都比较相似。 更专业一点说,k-means分析是…

【C++并发入门】摄像头帧率计算和多线程相机读取(上):并发基础概念和代码实现

前言 高帧率摄像头往往应用在很多opencv项目中,今天就来通过简单计算摄像头帧率,抛出一个单线程读取摄像头会遇到的问题,同时提出一种解决方案,使用多线程对摄像头进行读取。同时本文介绍了线程入门的基础知识,讲解了…

【muduo源码分析】「阻塞」「非阻塞」「同步」「异步」

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言何为「muduo库」安装muduo库阻塞、非阻塞、同步、异步数据准备数据准备 引言 从本篇博客开始,我会陆续发表muduo库源码分析的相关文章。感谢大家的持续关注!!…

9.29总结

这星期学了概率和组合数学 这是我觉得的一个有趣的题目,每个人身上都有n-1根绳子,如果组不成稳定三角,那么肯定有两个人相邻两根绳子颜色不一样,那么每两个这样的人就会贡献一个不稳定三角形,所以只要所有三角形减去每…

64.【C语言】再议结构体(下)(未完)

本文衔接第63篇 目录 6.复习 7.修改默认对齐数 8.结构体传参 01.传递非指针参数 02.传递指针参数(传递地址) 03.对比 9.结构体实现位段 01.位段的定义 02.格式 03.例题 答案速查 分析 前置知识:位段的内存分配 解析 若按浪费空间处理 验证 6.复习 20.【C语言…

①三菱Modbus主站MELSEC转ModbusRTU/ASCII工业MELSEC网关串口服务

三菱Modbus主站MELSEC转ModbusRTU/ASCII工业MELSEC网关串口服务https://item.taobao.com/item.htm?ftt&id834634632647 MELSEC 通信单元 MELSEC 转 RS485 MS-A1-80X1 系列概述 型号:1路总线MELSEC网关(单网口) MS-A1-8011 1路总线MELSEC网关(双…

A Learning-Based Approach to Static Program Slicing —— 论文笔记

A Learning-Based Approach to Static Program Slicing OOPLSA’2024 文章目录 A Learning-Based Approach to Static Program Slicing1. Abstract2. Motivation(1) 为什么需要能处理不完整代码(2) 现有方法局限性(3) 验证局限性: 初步实验研究实验设计何为不完整代码实验结果…

计算机网络基础--认识协议

目录 前言 一、IP地址与端口 二、网络协议 1.网络体系结构框架 2.网络字节序 前言 提示:这里可以添加本文要记录的大概内容: 计算机网络涉及非常广泛,这篇文章主要对计算机网络有个认识 提示:以下是本篇文章正文内容&#x…

C++系列-继承

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 继承的概念和定义 继承是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行拓展,增加功能,这样可以…

【PyTorch】生成对抗网络

生成对抗网络是什么 Generative Adversarial Nets,简称GAN GAN:生成对抗网络 —— 一种可以生成特定分布数据的模型 《Recent Progress on Generative Adversarial Networks (GANs): A Survey》 《How Generative Adversarial Networks and Its Varian…

基于Megatron-LM从0到1完成GPT2模型预训练、模型评估及推理

随着 ChatGPT 迅速爆火,引领基于Transformer架构的大模型从幕后走到台前。但 ChatGPT 的成功并不是一蹴而就,而是,经过了从早期的 GPT1 到 GPT2,之后到 GPT3 和 InstructGPT、然后到GPT3.5和ChatGPT,直到如今的多模态大…

一钉多用:自攻螺钉在家居与工业领域的广泛应用

自攻螺钉的结构要素有哪些重要特点? 自攻螺钉适用于非金属或软金属,不需要配合预先开好的孔和攻牙。自攻螺钉的尖头设计使其能够“自我攻入”材料中;而普通螺丝通常是平头,规格一致。自攻螺钉的关键在于,打孔时不需要进…

【JavaEE初阶】网络原理

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 ⽹络互连 IP地址 端口号 协议 协议分层 优势 TCP/IP 五层网络模型 数据在网络通信中的整体流程 封装和分用 封装 分用 ⽹络互连 随着时代的发展,越来越需…

Angular基础学习(入门 --> 入坑)

目录 一、Angular 环境搭建 二、创建Angular新项目 三、数据绑定 四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM 五、DOM 操作 (ViewChild) 六、组件通讯 七、生命周期 八、Rxjs 异步数据流 九、Http …

51单片机的光照强度检测【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块光照传感器按键蜂鸣器LED等模块构成。适用于光照强度检测、光照强度测量报警等相似项目。 可实现功能: 1、LCD1602实时显示光照强度信息 2、光照强度传感器(电位器模拟)采集光照信息 3、可…

X86架构(九)——保护模式的进入

全局描述符表 全局描述符表(Global Descriptor Table,GDT)是保护模式下非常重要的一个数据结构。 在保护模式下,对内存的访问仍然使用段地址和偏移地址,在每个段能够访问之前,必须先行设置好 GDT 的地址,并加载全局描述符表寄存…

emp.dll丢失怎么解决,快来试试这个几个解决方法

在日常使用电脑玩游戏的过程中,我们可能会遇到一些错误提示,其中最常见的就是“emp.dll丢失”。那么,emp.dll到底是什么?它为什么会丢失?丢失后会对我们的电脑产生什么影响?本文将为您详细解析emp.dll的概念…

[BUUCTF从零单排] Web方向 03.Web入门篇之sql注入-1(手工注入详解)

这是作者新开的一个专栏《BUUCTF从零单排》,旨在从零学习CTF知识,方便更多初学者了解各种类型的安全题目,后续分享一定程度会对不同类型的题目进行总结,并结合CTF书籍和真实案例实践,希望对您有所帮助。当然&#xff0…

打造高业绩朋友圈:策略与实践

在数字化时代,朋友圈不仅是个人生活的展示窗口,更是商业变现的有力平台。许多人通过精心经营朋友圈,实现了财富的增长,甚至达到了年入百万的惊人业绩。朋友圈已成为普通人实现逆袭的重要战场。 要打造一个业绩过万的朋友圈&#…

关于武汉芯景科技有限公司的IIC电平转换芯片XJ9509开发指南(兼容PCa9509)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.VCCA1.35V,VCCB5V,A1输入,B1输出 2.VCCA1.35V,VCCB5V,B1输入,A1输出 3.VCCA1.35V,VCCB5V,A2输入,B2输出 4.VCCA1.35V,VCCB5V,B2输入,A2输出