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

【D3.js in Action 3 精译】1.3 D3 视角下的数据可视化最佳实践(下)

当前内容所在位置

  • 第一部分 D3.js 基础知识
    • 第一章 D3.js 简介 ✔️
      • 1.1 何为 D3.js?
      • 1.2 D3 生态系统——入门须知
        • 1.2.1 HTML 与 DOM
        • 1.2.2 SVG - 可缩放矢量图形
        • 1.2.3 Canvas 与 WebGL
        • 1.2.4 CSS
        • 1.2.5 JavaScript
        • 1.2.6 Node 与 JavaScript 框架
        • 1.2.7 Observable 记事本
      • 1.3 数据可视化最佳实践(上)
      • 1.3 数据可视化最佳实践(下) ✔️
      • 1.4 本章小结 ✔️
    • 第二章 DOM 的操作方法(精译中 ⏳)

(上接第 1.3 小节正文部分:……从下一章开始,我们将着手创建 D3 可视化项目。)

与 Hesham Eissa、Lindsey Poulter 的访谈记录

EissaPoulter 都是数据可视化领域的设计师兼开发者。

【主持人】你们在一篇博文中写道,在开展 Ben & Jerry’s 项目之前,你们都有在 Tableau 中设计数据可视化的经验。是什么让你们想学习 D3 而不是其他数据可视化工具?(详见 https://heshameissa.com/blog/learn-d3/)

【嘉宾】 我们都很喜欢从很多优秀的可视化作品中汲取灵感,像 The Pudding 官网、Nadieh Bremer(荷兰著名数据可视化设计师)、Information is Beautiful Awards(权威数据可视化设计奖项,2012 年由英国设计师 David McCandless 创立,每年评选和表彰在数据可视化领域取得杰出成就的作品和设计师)以及各种新闻媒体制作的数据新闻作品。我们也注意到在所有这些备受瞩目的作品背后,D3 是它们共有的技术基础。

【嘉宾】 此外,我们俩都热衷于寻找创造性的方式来展示数据,不想被特定软件所提供的可视化功能束缚住手脚。利用 D3 和基于 Web 的可视化设计方案,我们觉得可以创作出任何我们想要的作品来,唯一能限制自己的恐怕就是自己的能力水平了。

【主持人】还是这篇博文,我很喜欢你们安排整个学习过程的这部分内容,因为你们之前没有前端开发的经验,并且能够静下心来一步一步地去做。在这个学习过程中,你们觉得最难的是什么?最享受的又是什么呢?

【嘉宾】 学习的过程中最困难的地方是有太多不同的知识点需要学习和理解;不仅如此,前端开发领域一直在飞速发展,我们还必须紧跟步伐,不断适应不同版本的示例,有时甚至会猛地跳到下一个主题——这也是一种困难,因为当时缺乏充分消化吸收每个知识点的耐心。

【嘉宾】 最令人愉快的,当属我们终于可以学以致用、将所学知识直接应用于数据可视化的那一刻。看到页面最终渲染出了第一个 SVG 图形,那一刻我们欣喜异常。在深入研究不同 D3 模块的过程中,我们乐此不疲地探索着每个模块提供的强大功能,以期在未来大放异彩。像 d3-force 这样极具灵活性和适用性的 D3 模块,真正拓展了我们对数据可视化的思考方式。

【主持人】遇到问题你们都会去哪儿寻求帮助呢?

【嘉宾】 与他人并肩学习的最大好处就在于有一个可以提问的固定搭档。如果我们不理解某个概念,就会互相询问。这样做要么再次印证我们都有困惑,需要花更多时间去研究;要么让一个人有机会以完全不同的方式进行阐释。

【嘉宾】 除了相互交流之外,我们还花了不少精力去了解该领域其他人的代码,看看他们是如何落地某个特定概念的。数据可视化社区最棒的一点就是乐于分享。迈克·博斯托克(Mike Bostock)在 Observable 以及更大的 Observable 社区上提供的 D3 示例往往是我们的救命稻草。通常,我们在创建一个新图表时,首先要看的就是他的示例——99% 的情况下,他都能提供我们需要的内容。The Pudding 网站和 Nadieh Bremer 在各自的 GitHub 账号上都有大量的源码可供参考,所以我们经常会问:“他们是如何实现这样的过渡效果的?”然后找到真正能用的示例。有趣的是,有个周末我们甚至还买了这本《D3.js 实战》的第一版,仅仅是因为当时对某个概念感到困惑,而网上又找不到任何答案。

【嘉宾】 不过也必须承认,有几次我们真的陷入了困境。一方面是我们的词汇量还不够丰富,无法清楚准确地描述需求进而上网搜到相关内容;另一方面则是因为我们总想找到一个很具体的解决方案。我们并不害怕连续花上几天甚至几周的时间去尝试各种方法、做各种实验。但由于没能找到全面了解 Web 数据可视化知识体系的捷径,我们最终不得不潜心积累、认真领悟,而不是简单地复制粘贴。

【主持人】相比与其他数据可视化工具,你们对于 D3.js 有什么特别喜欢、或特别不喜欢的地方吗?

【嘉宾】 D3 需要更多时间来学习如何使用。其他工具可能仅需单击几次鼠标就能创建一个柱状图,而 D3 可能需要 50 多行代码才能实现。不过,这也正是我们最喜欢 D3 的地方——你可以 掌控一切

项目精选《本杰瑞冰淇淋的内幕》(详见 https://benjerry.heshlindsdataviz.com/)

可视化作品《本杰瑞冰淇淋的 98 种口味》可视化作品《本杰瑞冰淇淋的 98 种口味》

【主持人】你们共同参与了《Ben & Jerry’s》系列作品的创作,具体分工是怎样的?是一个人专注于设计、另一个人专注于开发,还是两个人共同从事这两方面的工作?

【嘉宾】 我们采取的估计是一种非传统的合作模式。鉴于当时正处于全球大流行病的封锁期高峰,我们反倒有很多时间可供消磨。我们的做法不是分工合作,而是从头到尾学习和关注整个过程。我们会一起制作故事情节图(storyboard)、一起探索数据,然后设定一个目标。我们会说:"让我们构建一个和弦图,来展示冰淇淋的新品组合。一旦我们都完成了各自的工作,就会比较各自的代码,看看谁的方法更好,然后合并到一起,再开始下一个任务。一旦我们开始对自己的能力有信心,大概完成一半的时候就会开始分工合作。我们并没有将工作严格地划分为某人固定负责某项任务,只是根据需要互相配合,共同完成所有必要的工作。

【主持人】这个项目同时用到了 SVG 元素和 Canvas 画布。一些作品是基于 SVG 的,比如《本杰瑞冰淇淋完整口味指南》;而另一些主要基于 Canvas,比如像《本杰瑞冰淇淋的 98 种口味》。甚至在和弦图作品《本杰瑞 79 种加料》中结合了二者来进行创作。你们在 SVG 和 Canvas 的取舍上是如何考量的呢?是从一开始就考虑到这样的结构,还是说在实施的过程中出于性能考虑选择了 Canvas 画布呢?

【嘉宾】 我们从一开始就没有考虑过这样的结构。老实讲,起初我们可能连 Canvas 是什么都不清楚。在确定了要创作的可视化内容后,我们才开始着手添加过渡效果,但很快就发现效果非常糟糕。这促使我们开始研究不同的性能参数,并最终选定了 Canvas。

和弦图可视化作品《本杰瑞冰淇淋的 79 种加料》 和弦图可视化作品《本杰瑞冰淇淋的 79 种加料》

【主持人】二位已经成功地让整个项目在移动端运行良好,包括丰富的径向可视化效果。这期间是否不得不做出必要的妥协,比如调整原始想法以适应较小的触摸屏之类?在基于 Web 的可视化方面,你们更倾向于移动端优先还是桌面端优先呢?

【嘉宾】 到了后期分而治之阶段,我们最后要考虑的问题之一就是移动端。根据以往的经验,把它留到最后并不是最佳方案,因为有时候不得不做一些让步。我们不仅要搞清楚需要改变什么,还要弄清楚怎样去改变。借助滚动场景叙事(即 scrollytelling,详见 http://mng.bz/g7MV)我们成功解决了移动端的问题:一方面可以让文字在可视化效果上方滚动;另一方面也可以通过突出重要数据的方式来取代之前的交互逻辑。

【嘉宾】 桌面优先的策略固然为可视化提供了更多的施展空间,可以进行更复杂的交互和设计;但移动端会驱使你提炼出每个可视化效果的核心目的,这种做法在试图让整体表达更清楚明了时可能会有帮助。

【主持人】创作这个作品大概花了多长时间?当中有没有哪个环节是相对于其他步骤而言耗费的时间更久、或者难度更大的?

【嘉宾】 由于这是我们第一个真正意义上的 D3 可视化项目,需要不断学习来确保一切尽善尽美,每个部分都要重做很多次,因此在每天投入工作的基础上我们大概花了四个月的时间来完成整个创作过程。最终不得不给我们自己设定一个最后期限,因为我们知道如果不这样做,我们会继续重做、完善并发现问题。

【嘉宾】 至于项目中难度更大、耗时更久的部分,那一定是与前端开发关联更多的内容,涉及可视化方面的反而不多。我们已经完全按照自己的想法设计了所有的可视化内容和叙事场景,但后来才发现,想让这些内容在所有设备和浏览器上都能正常运行并且表现良好,还需要花费更多的时间和精力才能办到。

可视化作品《本杰瑞冰淇淋口味大全》可视化作品《本杰瑞冰淇淋口味大全》

【主持人】有没有规划过在不久的将来对 D3 的某个具体功能或模块进行探索,或者再深挖一下?

【嘉宾】 当然,有一些知识我们还处于“复制粘贴”的初期阶段,没能完全理解其工作原理,这其中就包括和弦图、桑基图和地理模块等等。此外,掌握更多的数学函数往往可以进一步帮助我们充分利用 D3 提供的强大功能。


1.4 本章小结

  • 当您想在数据可视化方面拥有完全的创意自由与技术自由时,D3 就是您的首选工具。

  • D3 应用程序的样式和服务类似于传统网络内容。

  • 我们从不单独使用 D3,而是将其作为技术和工具生态系统的一部分,并将其结合起来创建丰富的 Web 界面,包括:HTML、CSS、JavaScript、SVG、Canvas 以及 React 或 Svelte 等框架。

  • 在构建数据可视化时,最常使用的 SVG 图形有:直线(lines)、矩形(rectangles)、圆(circles)、椭圆(ellipses)、路径(paths)及文本(text)。

  • 使用 D3 需要对这些几何基元及其主要属性有基本的了解。

  • 在使用 D3 之前,应该熟悉 JavaScript 的两个核心知识——方法的链式调用和对象的操作:

    • 方法的链式调用,是在同一对象上相继调用多个方法的一种编程模式(pattern)。
    • 在 D3 中,数据集通常是以对象数组的形式出现的。JavaScript 提供了多种方法来访问和操作其中的数据。
  • 作为 D3 开发人员,扎实了解数据可视化的最佳实践至关重要。本章提到的多种资源都可以助您开启学习之旅。

(第一章完)

相关文章:

【D3.js in Action 3 精译】1.3 D3 视角下的数据可视化最佳实践(下)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 ✔️ 1.1 何为 D3.js?1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形1.2.3 Canvas 与 WebGL1.2.4 CSS1.2.5 JavaScript1.2.6 Node 与 JavaScript 框架1.2.7 Observable 记事…...

Solus Linux简介

以下是学习笔记,具体详实的内容请参考官网:Home | Solus Solus Linux 是一个独立的 Linux 发行版,它以其现代的设计、优化的性能和友好的用户体验而著称。以下是一些关于 Solus Linux 的最新动向和特点: 1. **最新版本发布**&a…...

常见的排序算法,复杂度

稳定 / 非稳定排序:两个相等的数 排序前后 相对位置不变。插入排序(希尔排序): 每一趟将一个待排序记录,按其关键字的大小插入到已排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。稳定&…...

鸿蒙特色物联网实训室

一、 引言 在当今这个万物皆可连网的时代,物联网(IoT)正以前所未有的速度改变着我们的生活和工作方式。它如同一座桥梁,将实体世界与虚拟空间紧密相连,让数据成为驱动决策和创新的关键力量。随着物联网技术的不断成熟…...

JVM垃圾回收-----垃圾分类

一、垃圾分类定义 垃圾分类是JVM垃圾分类中的第一步,这一步将堆中的对象分为存活对象和垃圾对象两类。 在垃圾分类阶段,JVM会从一组根对象开始,通过对象之间的引用关系,遍历所有的对象,并将所有存活的对象进行标记。…...

前端基础之JavaScript学习——变量、数据类型、类型转换

大家好,我是来自CSDN的博主PleaSure乐事,今天我们开始有关JS的学习,希望有所帮助并巩固有关前端的知识。 我使用的编译器为vscode,浏览器使用为谷歌浏览器,使用webstorm或其他环境效果几乎一样,使用系统自…...

SQL常用数据过滤---IN操作符

在SQL中,IN操作符常用于过滤数据,允许在WHERE子句中指定多个可能的值。如果列中的值匹配IN操作符后面括号中的任何一个值,那么该行就会被选中。 以下是使用IN操作符的基本语法: SELECT column1, column2, ... FROM table_name WH…...

HDFS和FDFS

HDFS(Hadoop Distributed File System)和FDFS(FastDFS)是两种不同的分布式文件系统,它们各自有不同的设计目标和使用场景。以下是对它们的详细介绍: HDFS(Hadoop Distributed File System&…...

Flutter对接FlutterBugly 报错Zone mismatch

在Flutter对接FutterBlugy时报如下错误: Unhandled Exception: Zone mismatch. E/flutter ( 1292): The Flutter bindings were initialized in a different zone than is now being used. This will likely cause confusion and bugs...

Docker缩小镜像体积与搭建LNMP架构

镜像加速地址 {"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.1panel.live"] } daemon.json 配置文件里面 bip 配置项中可以配置docker 的网段 {"graph": "/data/docker", #数据目录&#xff0…...

六边形动态特效404单页HTML源码

源码介绍 动态悬浮的六边形,旁边404文字以及跳转按钮,整体看着像科技二次元画风,页面简约美观,可以做网站错误页或者丢失页面,将下面的代码放到空白的HTML里面,然后上传到服务器里面,设置好重定向即可 效果预览 完整源码 <!DOCTYPE html> <html><head…...

BGP路径属性

路径属性分类 1. 公认属性&#xff08;所有 BGP 路由器都能识别&#xff09; (1) 公认必遵 a&#xff09; AS path b&#xff09;Origin c&#xff09; Next hop (2) 公认任意 a&#xff09; local preference b&#xff09;atomic aggregate 2. 可选属性&#xff08;…...

从零开始学量化~Ptrade使用教程(六)——盘后定价交易、港股通与债券通用质押式回购

盘后固定价交易 实现科创板、创业板的盘后固定价交易&#xff0c;界面如下显示&#xff1a; 交易 输入科创板或创业板代码&#xff0c;选择委托方向&#xff0c;输入委托价格、委托数量&#xff0c;点击“买入”或“卖出”按钮进行委托。可出现一个委托提示框提示是否继续委托操…...

Docker 三剑客

文章目录 Docker 三剑客1. Docker Engine功能与特点&#xff1a;工作原理&#xff1a;示例命令&#xff1a; 2. Docker Compose功能与特点&#xff1a;工作原理&#xff1a;示例文件 (docker-compose.yml)&#xff1a;示例命令&#xff1a; 3. Docker Swarm功能与特点&#xff…...

每天一个数据分析题(四百三十一)- 卡方检验

在列联表分析中&#xff0c;下列不能用卡方检验的是&#xff08;&#xff09; A. 多个构成的比较 B. 多个率的比较 C. 多个均值的比较 D. 以上都不是 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖…...

Flowable-流程图标与流程演示

BPMN 2.0是业务流程建模符号2.0的缩写。它由Business Process Management Initiative这个非营利协会创建并不断发展。作为一种标识&#xff0c;BPMN 2.0是使用一些符号来明确业务流程设计流程图的一整套符号规范&#xff0c;它能增进业务建模时的沟通效率。目前BPMN2.0是最新的…...

MyBatis源码中的设计模式2

组合模式的应用 组合模式介绍 组合模式(Composite Pattern) 的定义是&#xff1a;将对象组合成树形结构以表示整体和部分的层次结构。组合模式可以让用户统一对待单个对象和对象的组合。 比如&#xff1a;Windows操作系统中的目录结构&#xff0c;通过tree命令实现树形结构展…...

AI发展中的伦理挑战与应对策略

AI发展中的伦理挑战与应对策略 人工智能&#xff08;AI&#xff09;的快速发展在为社会带来许多便利和创新的同时&#xff0c;也带来了诸多伦理挑战。这些挑战主要集中在数据隐私侵犯、信息茧房的制造、歧视性算法、深度伪造技术等方面。针对这些问题&#xff0c;需要从多个层…...

基于用户非兴趣/非偏好/非习惯的推荐

基于用户非兴趣、非偏好、非习惯的推荐是一种个性化推荐技术&#xff0c;旨在为用户提供与其日常行为和兴趣模式不同的推荐内容。这种推荐方法的目的是打破用户的信息过滤和习惯&#xff0c;发现新的、潜在的兴趣点&#xff0c;从而提供更广泛和多样化的推荐结果。 通过收集和分…...

Abaqus基于CT断层扫描的三维重建插件CT2Model 3D

插件介绍 AbyssFish CT2Model 3D V1.0 插件可将采用X射线等方法获取的计算机断层扫描&#xff08;CT&#xff09;图像在Abaqus有限元软件内进行三维重建&#xff0c;进而高效获取可供模拟分析的有限元模型。插件可用于医学影像三维重构、混凝土细观三维重建、岩心数字化等领域…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...