【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.rhkb.cn/news/439782.html

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

相关文章

【Python】Streamlit:为数据科学与机器学习打造的简易应用框架

Streamlit 是一个开源的 Python 库,专为数据科学家和机器学习开发者设计,旨在快速构建数据应用。通过简单的 Python 脚本,开发者无需掌握前端技术,即可将数据分析和模型结果转化为直观、交互式的 Web 应用。其简洁的 API 设计使得…

MATLAB下的RSSI定位程序,二维平面上的定位,基站数量可自适应

文章目录 引言程序概述程序代码运行结果待定位点、锚点、计算结果显示待定位点和计算结果坐标 引言 随着无线通信技术的发展,基于 R S S I RSSI RSSI(接收信号强度指示)的方法在定位系统中变得越来越流行。 R S S I RSSI RSSI定位技术特别适…

Android车载——VehicleHal初始化(Android 11)

1 概述 VehicleHal是AOSP中车辆服务相关的hal层服务。它主要定义了与汽车硬件交互的标准化接口和属性管理,是一个独立的进程。 2 进程启动 VehicleHal相关代码在源码树中的hardware/interfaces/automotive目录下 首先看下Android.bp文件: cc_binary …

【Linux的那些事】shell命名及Linux权限的理解

目录 一、shell命令以及运行原理 二、Linux权限的概念 三、Linux权限管理 3.1.文件访问者的分类(人) 3.2.文件类型和访问权限(事物属性) 3.3.文件权限值的表示方法 3.4.文件访问权限的相关设置方法 a)chmod b)chown c)…

【Spring Boot React】Spring Boot和React教程 完整版

【Spring Boot & React】Spring Boot和React教程 在B站找到一个不错的SpringBoot和React的学习视频,作者是amigoscode 【Spring Boot & React】Spring Boot和React教程 2023年更新版【Spring Boot React】价值79.9美元,全栈开发,搭…

Luminar激光雷达公司裁员重组的深度分析

在科技行业风起云涌的今天,每一家企业都面临着前所未有的挑战与机遇。当地时间9月23日,美国激光雷达领域的领军企业Luminar Technologies向美国证券交易委员会(SEC)提交了一份8-K报告,正式宣布了一项重大的业务重组计划,其核心内容是通过进一步裁员来优化成本结构,以期在…

windows上安装python环境

前言 最近电脑重装了系统,需要重新安装python环境 ,因此记录一下 1.下载 打开python官网下载,下载链接:https://www.python.org/downloads/windows/ 点击下载 ,我这里使用64位操作系统(大部分电脑),根据…

快速上手C语言【上】(非常详细!!!)

目录 1. 基本数据类型 2. 变量 2.1 定义格式 和 命名规范 2.2 格式化输入和输出(scanf 和 printf) ​编辑 2.3 作用域和生命周期 3. 常量 4. 字符串转义字符注释 5. 操作符 5.1 双目操作符 5.1.1 算数操作符 5.1.2 移位操作符 5.1.3 位操作符…

为Floorp浏览器添加搜索引擎及搜索栏相关设置. 2024-10-05

Floorp浏览器开源项目地址: https://github.com/floorp-Projects/floorp/ 1.第一步 为Floorp浏览器添加搜索栏 (1.工具栏空白处 次键选择 定制工具栏 (2. 把 搜索框 拖动至工具栏 2.添加搜索引擎 以添加 搜狗搜索 为例 (1.访问 搜索引擎网址 搜狗搜索引擎 - 上网从搜狗开始 (2…

Java 网络编程基础

网络通信三要素 此笔记来之与黑马.B站的视频是真的高 基本的通信架构 基本的通信架构有2种形式:CS架构(Client 客户端/ Server 服务端)、BS架构( Browser 浏览器/ Server 服务端)。 IP 地址 IP(InternetProtocol)&a…

关于Zipf定律与TF—IDF的一个实践

在这篇文章中,我将通过机器学习中的线性回归来计算zipf定律中一个经验常数alpha,还会画TF-IDF的图像,此外还将简单介绍下与zipf、TF-IDF有关的知识。 在之前的一篇文章中我曾介绍过TF-IDF,但之后我又阅读了Ricardo Baeza-Yates和…

PELT算法

PELT算法的范畴 PELT算法(Pruned Exact Linear Time)属于时间序列分析和变点检测(Change Point Detection)范畴的算法。 从更广泛的角度来看,PELT算法还可以归类为以下几类算法的子集: 1. 时间序列分析&…

【数据结构】什么是红黑树(Red Black Tree)?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌红黑树的概念 📌红黑树的操作 🎏红黑树的插入操作 🎏红黑树的删除操作 结语 📌红黑树的概念 我们之前学过了…

codetop标签树刷题(四)!!暴打面试官!!!!

用于个人复习 1.二叉树的右视图2.二叉树最大宽度3.二叉树的最大深度4.N叉树的最大深度5.二叉树的最小深度6.子树的最大平均值7.求根节点到叶节点的数字之和8.另一棵树的子树9.对称二叉树 1.二叉树的右视图 给定一个二叉树的根节点root,想象自己站在它的右侧&#x…

TypeScript 封装 Axios 1.7.7

随着Axios版本的不同,类型也在改变,以后怎么写类型? yarn add axios1. 封装Axios 将Axios封装成一个类,同时重新封装request方法 重新封装request有几个好处: 所有的请求将从我们定义的requet请求中发送&#xff…

setTimeout,setInterval ,requestAnimationFrame定时器

setTimeout,setInterval ,requestAnimationFrame定时器 定时器函数通常用于执行定时任务,也就是说你做了一个功能放在定时器函数里,它可以在特定的时间去执行你的指令,或者说隔多长时间(单位时间内—毫秒为…

Centos Stream 9备份与恢复、实体小主机安装PVE系统、PVE安装Centos Stream 9

最近折腾小主机,搭建项目环境,记录相关步骤 数据无价,丢失难复 1. Centos Stream 9备份与恢复 1.1 系统备份 root权限用户执行进入根目录: cd /第一种方式备份命令: tar cvpzf backup.tgz / --exclude/proc --exclu…

计算机系统基础概述

什么是计算机? 计算机是一种利用电子技术进行信息处理的设备,它能够接收、存储、处理和提供数据。计算机通过执行一系列预定义的指令来处理数据,这些指令通常被称为程序。计算机的核心功能包括算术运算、逻辑判断、数据存储和信息检索 计算…

STM32 通用定时器

一、概述 STM32内部集成了多个定时/计数器,根据型号不同,STM32系列芯片最多包含8个定时/计数器。其中,TIM6、TIM7为基本定时器,TIM2~TIM5为通用定时器,TIM1、TIM8为高级控制定时器。 1.定时器的类型 基本定时器通用定…

微信小程序-npm支持-如何使用npm包

文章目录 1、在内建终端中打开2、npm init -y3、Vant Weapp4、通过 npm 安装5、构建 npm 1、在内建终端中打开 Windows PowerShell 版权所有 (C) Microsoft Corporation。保留所有权利。尝试新的跨平台 PowerShell https://aka.ms/pscore6PS C:\Users\dgq\WeChatProjects\minip…