当前位置: 首页 > news >正文

【D3.js in Action 3 精译_043】5.1 饼图和环形图的创建(中):D3 饼图布局生成器的配置方法

当前内容所在位置:

  • 第五章 饼图布局与堆叠布局 ✔️
    • 5.1 饼图和环形图的创建 ✔️
      • 5.1.1 准备阶段(上篇)
      • 5.1.2 饼图布局生成器(中篇) ✔️
      • 5.1.3 圆弧的绘制
      • 5.1.4 数据标签的添加

文章目录

    • 5.1.2 饼图布局生成器 The pie layout generator
      • 5.1.2.1 数据的格式化处理 Formatting the data
      • 5.1.2.2 饼图布局生成器的初始化及其调用 Initializing and calling the pie layout generator

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

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

【译者按】看似神秘的 D3 饼图布局生成器函数,在作者抽丝剥茧般的讲解和精心制作的示意图下,变得非常浅显易懂。这才是真正的高手,用最简单的话,讲明白最核心的原理。尽管当中的 JavaScript 处理逻辑比较冗长,但瑕不掩瑜。

5.1.2 饼图布局生成器 The pie layout generator

准备工作完成后,就可以专注于环形图的构建了。饼图和环形图通过可视化的方式描述部分与整体之间的关系,或者刻画各部分的数量相对于总量之间的数量关系。利用 D3 的饼图布局生成器,我们可以根据环形图中各个部分相对于总量的百分比,算出其对应的起始角和终止角。

5.1.2.1 数据的格式化处理 Formatting the data

D3 饼图生成器期望的参数类型为数字型数组。例如,对于 1975 年的数据,我们希望它是一个包含各种音乐格式的当年的销售额数组:

const sales1975 = [8061.8, 2770.4, 469.5, 0, 0, 0, 48.5];

虽然这样一个简单的数组已经可以生成饼图了,但我们无从得知每个数字对应的音乐格式是什么。为了补全这些信息,可以将其改为对象数组,其中每个对象都包含音乐格式的 ID 以及对应的年度销售额。

如下列代码清单 5.3 所示,首先从数据集的 columns 属性提取音乐格式信息。例如,在使用 d3.csv() 方法加载数据时,D3 会将一个包含原始 CSV 数据列标题的数组添加到数据集中,并允许开发者通过 data.columns 进行访问。如果将获取到的数据输出到控制台,会在结果数组的末尾看到这个列标题数组,如图 5.5 所示。由于只需要考虑音乐格式,所以要筛选掉数组中的“年份”(即 "year")列。

图 5.5 从 CSV 文件获取数据时,D3 会将一个列标题数组添加到原始数据集中,并可通过 data.columns 访问该列标题数组

【图 5.5 从 CSV 文件获取数据时,D3 会将一个列标题数组添加到原始数据集中,并可通过 data.columns 访问该列标题数组】

为了制备饼图生成器需要的对象数组,还需要提取待实现的年份数据,然后利用 JavaScriptfind() 方法找到当年对应的数据项,再赋给常量 yearData

接着遍历音乐格式数组,为每种格式创建一个对象,里面包含当前格式的 ID 以及关联年份的销售额数据。最后将该对象添加到提前声明好的 formattedData 数组中。

代码清单 5.3 对数据进行格式化处理(详见 donut-chart.js 文件)

const years = [1975, 1995, 2013];
const formats = data.columns.filter(format => // 从数据 data 的 columns 属性提取出需要的音乐格式,并筛选掉 “年份” 字段format !== "year");                         years.forEach(year => {...const yearData = data.find(d => d.year === year); // 读取特定年份的数据项const formattedData = []; // 初始化一个空数组作为最终的结果数组formats.forEach(format => { // 遍历每一种音乐格式,分别创建一个对象,令其包含该格式的 ID 以及当年该音乐格式的销售额。然后将当前对象添加到结果数组。formattedData.push({ format: format,                             sales: yearData[format] });                                   });                                                              });

数据准备就绪后,就得到一个如下所示的对象数组,其中每个对象都包含一个音乐格式 ID 以及当前年份的销售额数据:

// => formattedData = [{ format: "vinyl", sales: 8061.8 },{ format: "eight_track", sales: 2770.4 },{ format: "cassette", sales: 469.5 },{ format: "cd", sales: 0 },{ format: "download", sales: 0 },{ format: "streaming", sales: 0 },{ format: "other", sales: 48.5 }];

5.1.2.2 饼图布局生成器的初始化及其调用 Initializing and calling the pie layout generator

既然数据已就绪,接下来就可以初始化我们的饼图布局生成器(pie layout generator)了,用到的方法是 d3.pie()。该方法隶属于 d3-shape 模块。鉴于数据格式为一个对象数组,我们需要告诉布局生成器:从哪里能获取到控制圆弧长短的数值,具体通过 value() 方法进行配置,如下列代码片段所示。最后,将该生成器赋给一个常量 pieGenerator,以备后用。

const pieGenerator = d3.pie().value(d => d.sales);

为了生成饼图布局带注解的数据,只需调用刚才的生成器函数,然后将格式化处理后的数据作为参数传入即可;然后将得到的结果赋给另一个常量 annotatedData

const pieGenerator = d3.pie().value(d => d.sales);
const annotatedData = pieGenerator(formattedData);

饼图生成器函数返回的是一个全新的带注解的数据集,里面既有对原始数据项的引用,同时也添加了一些新属性(attributes),比如各部分的值(value)、当前部分的索引值(index)、起始角大小(startAngle)以及终止角大小(startAngle)(角度值均为弧度制):

// => annotatedData = [{data: { format: "vinyl", sales: 8061.8 },value: 8061.8,index: 0,startAngle: 0,endAngle: 4.5,padAngle: 0,},...];

注意代码中还包含了一个 padAngle 属性,它是各环形片段间的填充角,当前值为 0,稍后再进行修改。关键要明白一点:饼图布局生成器并不直接参与 D3 饼图的绘制,它只是一个预处理环节,用于计算绘制饼图各部分对应的角度值。如图 5.1 和 5.6 所示,该环节通常涉及以下三个步骤:

  1. 格式化数据;
  2. 初始化饼图布局函数;
  3. 调用饼图布局函数并将格式化的数据作为参数传入。稍后再利用该函数返回的带注解信息的数据集来具体绘制各段弧线。

图 5.6 饼图布局生成器是一个预处理步骤,负责生成一个包含每片段起始角、终止角在内的带注解信息的数据集。该过程通常涉及数据的格式化处理、饼图生成器函数的初始化及其调用

【图 5.6 饼图布局生成器是一个预处理步骤,负责生成一个包含每片段起始角、终止角在内的带注解信息的数据集。该过程通常涉及数据的格式化处理、饼图生成器函数的初始化及其调用】

(中篇完)



另附:专栏文章连载期间 完全免费,后续 不排除 调整为收费专栏。对 D3.js 感兴趣、或者想要从零开始彻底掌握 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.1.2.1 比例尺的声明(中篇)
          • 4.1.2.2 坐标轴的添加(下篇)
          • 4.1.2.3 轴标签的添加(下篇)
      • 4.2 D3 折线图的绘制
        • 4.2.1 直线生成工具的使用
        • 4.2.2 对数据点作曲线插值处理
      • 4.3 D3 面积图的绘制
        • 4.3.1 面积图生成工具的用法
        • 4.3.2 用标签提高图表的可读性
      • 4.4 D3 弧形图的绘制
        • 4.4.1 D3 中的极坐标系
        • 4.4.2 圆弧生成器的使用
        • 4.4.3 圆弧形心的计算
        • 4.4.4 人物专访:Francis Gagnon、Patricia Angkiriwang 和 Olivia Gélinas
      • 4.5 本章小结

相关文章:

【D3.js in Action 3 精译_043】5.1 饼图和环形图的创建(中):D3 饼图布局生成器的配置方法

当前内容所在位置: 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段(上篇)5.1.2 饼图布局生成器(中篇) ✔️5.1.3 圆弧的绘制5.1.4 数据标签的添加 文章目录 5.1.2 饼图布局生成器 The …...

离线安装ollama到服务器

搜了很多教程不满意,弄了半天才弄好,这里记录下,方便以后的人用,那个在线下载太慢,怕不是得下载到明年。 一.从官网下在liunx版的tgz安装包 Releases ollama/ollama (github.com) 查看自己的服务器信息(参考 https:/…...

自动化点亮LED灯之程序编写

程序编写: #!/bin/shecho none > /sys/class/leds/led1/triggerecho none > /sys/class/leds/led2/triggerecho none > /sys/class/leds/led3/triggerecho 0 > /sys/class/leds/led1/brightnessecho 0 > /sys/class/leds/led2/brightnessecho 0 >…...

linux 系列服务器 高并发下ulimit优化文档

系统输入 ulimit -a 结果如下 解除或提高 Linux 系统的最大进程数 在高并发场景中,合理设置 Linux 系统的最大进程数对于提升服务器性能至关重要。以下是具体步骤: 临时修改 ulimit 设置 可以通过 ulimit 命令临时调整当前会话的最大进程数。 查看当前…...

人工智能入门数学基础:统计推断详解

人工智能入门数学基础:统计推断详解 目录 前言 1. 统计推断的基本概念 1.1 参数估计 1.2 假设检验 2. 统计推断的应用示例 2.1 参数估计示例:样本均值和置信区间 2.2 假设检验示例:t检验 3. 统计推断在人工智能中的应用场景 总结 前言…...

Spark区分应用程序 Application、作业Job、阶段Stage、任务Task

目录 一、Spark核心概念 1、应用程序Application 2、作业Job 3、阶段Stage 4、任务Task 二、示例 一、Spark核心概念 在Apache Spark中,有几个核心概念用于描述应用程序的执行流程和组件,包括应用程序 Application、作业Job、阶段Stage、任务Task…...

【Liunx篇】基础开发工具 - yum

文章目录 🌵一.Liunx下安装软件的方案🐾1.源代码安装🐾2.rpm包安装🐾3.包管理器进行安装 🌵二.软件包管理器-yum🌵三.yum的具体操作🐾1.查看软件包🐾2.安装软件包🐾3.卸载…...

docker学习笔记(五)--docker-compose

文章目录 常用命令docker-compose是什么yml配置指令详解versionservicesimagebuildcommandportsvolumesdepends_on docker-compose.yml文件编写 常用命令 命令说明docker-compose up启动所有docker-compose服务,通常加上-d选项,让其运行在后台docker-co…...

电子商务人工智能指南 4/6 - 内容理解

介绍 81% 的零售业高管表示, AI 至少在其组织中发挥了中等至完全的作用。然而,78% 的受访零售业高管表示,很难跟上不断发展的 AI 格局。 近年来,电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…...

Hadoop3集群实战:从零开始的搭建之旅

目录 一、概念 1.1 Hadoop是什么 1.2 历史 1.3 三大发行版本(了解) 1.4 优势 1.5 组成💗 1.6 HDFS架构 1.7 YARN架构 1.8 MapReduce概述 1.9 HDFS\YARN\MapReduce关系 二、环境准备 2.1 准备模版虚拟机 2.2 安装必要软件 2.3 安…...

Kotlin设计模式之桥接模式

桥接模式用于将抽象部分与实现部分分离,使它们可以独立变化。Kotlin中可以通过接口和抽象类来实现桥接模式。以下是桥接模式的实现方法: 一. 基本桥接模式 在这种模式中,定义一个抽象部分和一个实现部分,通过组合将它们连接起来…...

详解组合模式

引言 有一种情况,当一组对象具有“整体—部分”关系时,如果我们处理其中一个对象或对象组合(区别对待),就可能会出现牵一发而动全身的情况,造成代码复杂。这个时候,组合模式就是一种可以用一致的…...

【系统架构设计师论文】云上自动化运维及其应用

随着云计算技术的迅猛发展,企业对云资源的需求日益增长。为了应对这一挑战,云上自动化运维(CloudOps)应运而生,它结合了DevOps理念和技术,通过自动化工具和流程来提高云环境的管理效率和服务质量。本文将探讨云上自动化运维的主要衡量指标,并详细介绍一个实际项目中如何…...

交换排序----快速排序

快速排序 快速排序是一种高效的排序算法,它采用分治法策略,将数组分为较小和较大的两个子数组,然后递归排序两个子数组。 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序…...

ES 与 MySQL 在较大数据量下查询性能对比

在进行数据查询性能测试的过程中,我的同事幺加明对 ES(Elasticsearch)和 MySQL 进行了相对较大数据量的测试,并整理了相关结果。在得到其授权的情况下,我将此对比案例分享给大家,在此再次向幺加明表示感谢。…...

C# 新语法中的字符串内插$和{}符号用法详解

自C#6.0开始提供一个新的语法糖,即"$" 符号,配合“{}”使用,它的作用除了是对String.format的简化,还可设置其格式模板,实现了对字符串的拼接优化。 语法格式: $"string {变量表达式}” 语…...

Nacos源码学习-本地环境搭建

本文主要记录如何在本地搭建Nacos调试环境来进一步学习其源码,如果你也刚好刷到这篇文章,希望对你有所帮助。 1、本地环境准备 Maven: 3.5.4 Java: 1.8 开发工具:idea 版本控制工具: git 2、下载源码 官方仓库地址 :https://git…...

windows 好工具

Windows文件夹目录大小分析工具WizTree...

计算机运行时提示错误弹窗“由于找不到 quazip.dll,无法继续执行代码。”是什么原因?“quazip.dll文件缺失”要怎么解决?

计算机运行时错误解析:解决“quazip.dll缺失”问题指南 在软件开发和日常计算机使用中,我们经常会遇到各种运行时错误。今天,我们将深入探讨一个常见的错误提示:“由于找不到quazip.dll,无法继续执行代码。”这一弹窗…...

创造未来:The Sandbox 创作者训练营如何赋能全球创造者

创作者训练营让创造者有能力打造下一代数字体验。通过促进合作和提供尖端工具,The Sandbox 计划确保今天的元宇宙是由一个个创造者共同打造。 2024 年 5 月,The Sandbox 推出了「创作者训练营」系列,旨在重新定义数字创作。「创作者训练营」系…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...