当前位置: 首页 > 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;进而高效获取可供模拟分析的有限元模型。插件可用于医学影像三维重构、混凝土细观三维重建、岩心数字化等领域…...

Mindspore框架CycleGAN模型实现图像风格迁移|(三)损失函数计算

Mindspore框架&#xff1a;CycleGAN模型实现图像风格迁移算法 Mindspore框架CycleGAN模型实现图像风格迁移|&#xff08;一&#xff09;CycleGAN神经网络模型构建 Mindspore框架CycleGAN模型实现图像风格迁移|&#xff08;二&#xff09;实例数据集&#xff08;苹果2橘子&…...

ENSP中VLAN的设置

VLAN的详细介绍 VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是一种将一个物理的局域网在逻辑上划分成多个广播域的技术。 以下是关于 VLAN 的一些详细介绍&#xff1a; 一、基本概念 1. 作用&#xff1a; - 隔离广播域&#xff1a…...

《后端程序员 · Nacos 常见配置 · 第一弹》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

深入解析HTTPS与HTTP

在当今数字化时代&#xff0c;网络安全已成为社会各界关注的焦点。随着互联网技术的飞速发展&#xff0c;个人和企业的数据安全问题日益凸显。在此背景下&#xff0c;HTTPS作为一种更加安全的通信协议&#xff0c;逐渐取代了传统的HTTP协议&#xff0c;成为保护网络安全的重要屏…...

vue3+TS从0到1手撸后台管理系统

1.路由配置 1.1路由组件的雏形 src\views\home\index.vue&#xff08;以home组件为例&#xff09; 1.2路由配置 1.2.1路由index文件 src\router\index.ts //通过vue-router插件实现模板路由配置 import { createRouter, createWebHashHistory } from vue-router import …...

黑马头条-环境搭建、SpringCloud

一、项目介绍 1. 项目背景介绍 项目概述 类似于今日头条&#xff0c;是一个新闻资讯类项目。 随着智能手机的普及&#xff0c;人们更加习惯于通过手机来看新闻。由于生活节奏的加快&#xff0c;很多人只能利用碎片时间来获取信息&#xff0c;因此&#xff0c;对于移动资讯客…...

基于centos2009搭建openstack-t版-ovs网络-脚本运行

openstackT版脚本 环境变量ip初始化 controlleriaas-pre.shiaas-install-mysql.shiaas-install-keystone.shiaas-install-glance.shiaas-install-placement.shiaas-install-nova-controller.shiaas-install-neutron-controller.shiaas-install-dashboard.sh computeiaas-instal…...

buuctf-web

查看后端源码 得到base64编码&#xff0c;解码得flag...

UBUNTU22 安装QT5.15.2 记录

安装QT预置安装软件包 sudo apt install gcc sudo apt install g sudo apt install clang sudo apt install clang sudo apt install make sudo snap install cmake --classic sudo apt-get install build-essential sudo apt install libxcb-xinerama0 #安装OpenGL核心库 su…...

C++基础知识:C++内存分区模型,全局变量和静态变量以及常量,常量区,字符串常量和其他常量,栈区,堆区,代码区和全局区

1.C内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区:存放函数体的二进制代码&#xff0c;由操作系统进行管理的&#xff08;在编译器中所书写的代码都会存放在这个空间。&#xff09; 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分…...