【D3.js in Action 3 精译_020】2.6 用 D3 设置与修改元素样式 + 名人专访(Nadieh Bremer)+ 2.7 本章小结

news2024/9/20 22:49:15

当前内容所在位置

  • 第一部分 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 本章小结 ✔️

2.6 用 D3 设置与修改元素样式

为了让可视化元素拥有想要的外观和感觉,需要为其设置样式。使用传统的 CSS 样式表就是一种不错的方案,通常也是考虑后期可维护性时的优先方案。但有时直接使用 D3 来设置与修改样式属性同样很方便,尤其是在样式随数据动态变化的时候。

D3 通过 selection.style() 方法设置与修改元素的样式属性(attribute)。该方法需要两个参数:样式属性的名称及其属性值,如图 2.16 所示:

图 2.16 style() 方法

图 2.16 style() 方法

回到条形图示例,在 main.js 中,在 SVG 容器选择集上链式调用 style() 方法,即赋值到常量 svg 上的方法。如以下代码所示,使用 style() 方法为 SVG 容器应用边框样式,可以赋值为任何想要的属性值。本例中使用简写样式,设置一个宽度 1px 的黑色边框:

const svg = d3.select(".responsive-svg-container")
  .append("svg")
    .attr("viewBox", "0 0 1200 1600")
    .style("border", "1px solid black");

SVG 容器四周的边框有助于直观了解当前所处的空间区域,并理解 style() 方法的工作原理。

保存项目并在浏览器中查看效果。从 DOM 检查工具中找到 SVG 容器,可以看到 border 属性(property)被添加到了 style 属性(attribute)中,如图 2.17 所示。也就是说 style() 方法注入了所谓的行内样式。

图 2.17 使用 style() 方法生效的边框样式

图 2.17 使用 style() 方法生效的边框样式

在处理 SVG 元素时,有些样式可以通过 attribute 属性或行内样式来生效,例如 fillstroke 属性(properties)。至于应该使用 attr() 还是 style() 方法来设置样式并没有严格的规定,但一些开发人员更愿意保持一致,始终使用 CSS 样式表样式(或行内样式)来设置样式,而不是通过元素的 attribute 属性。这也许是一个不错的做法,尤其是在我们希望分开创建形状的代码与设置外观的代码、使得层叠样式更易于管理的时候。本书将使用 attr()style() 方法以及外部 CSS 文件来设置 SVG 元素的视觉属性。

例如,在 main.js 中,在矩形选择集上调用 style() 方法,并对该矩形设置与之前不同的填充色 "plum",如以下代码所示:

svg
  .append("rect")
    .attr("x", 10)
    .attr("y", 10)
    .attr("width", 414)
    .attr("height", 16)
    .attr("fill", "turquoise")
    .style("fill", "plum");

然后打开 main.css 文件,为该矩形添加第三个 fill 属性(property),令其颜色值为 "orange"

rect {
  fill: orange;
}

此时该矩形拥有三种不同的填充样式:一个是通过元素 attribute 属性设置的青绿色 "turquoise";一个是通过行内样式应用设置的深紫色 "plum";最后是通过外部 CSS 样式设置的橙黄色 "orange"。当然,实际工作不会这样设置,本例仅供演示。

保存项目,注意观察借助 style 属性设置的 fill 样式是如何覆盖另两种样式的。在图 2.18 中,您可以看到样式中的层叠规则是如何生效的:行内样式覆盖了其余样式,其次是外部 CSS 样式表设置的样式,最后是通过 attribute 属性设置的 fill 样式。牢记这一规则将有助于制定适合自己习惯、团队和项目的策略,同时也可以在遇到下面的问题时摆脱百思不得其解的窘境:为什么这种样式在屏幕上可见、而另一种偏偏就不可见呢?

图 2.18 填充样式 fill 同时在 attribute 属性、外部样式表及行内样式应用的效果对比

图 2.18 填充样式 fill 同时在 attribute 属性、外部样式表及行内样式应用的效果对比

至此,我们已经知道如何获取选择集、如何在 DOM 中添加元素、以及如何给这些元素设置方位与样式。但是,真要像示例这样逐一添加条形图的各个矩形条,效率肯定高不了。等下一章学了数据绑定的相关知识后,就能一次性添加所有的矩形条了。在此之前,需要删除 main.jsmain.css 中与矩形相关的代码,让 main.js 文件只包含如下所示的代码。第三章将从这里开始构建条形图:

代码清单 2.2 本章结束时 main.js 的代码内容

const svg = d3.select(".responsive-svg-container")
  .append("svg")
    .attr("viewBox", "0 0 1200 1600")
    .style("border", "1px solid black");

人物专访:纳迪埃·布雷默(Nadieh Bremer)

纳迪埃·布雷默 是一位数据可视化艺术家。

【问】能否介绍一下您的背景,以及您是如何进入数据可视化领域的?

【Nadieh】 我毕业时是一名天文学家,之后开始从事数据科学方面的工作。然而,几年后,我意识到自己缺少了工作中富有创意的一面。当我看到别人称他们自己为“数据可视化专家”时,我立刻意识到这正是我可以兼顾的地方:在调查数据、探寻故事、玩转数学的同时发挥自己的创造力。

【问】在没有 Web 开发背景的情况下,是什么促使您学习 D3?遇到的主要挑战是什么,又是如何克服的呢?

【Nadieh】 我参加了一次 D3.js 研讨会(2013 年),会上人们展示了包括交互在内的 D3 的各种可能性。尤其是在当时,我从未见过这样的新事物,我知道自己也想创建出这样的交互式数据可视化效果。于是便买了一本斯科特·穆雷(Scott Murray)写的书《网络交互式数据可视化》(Interactive Data Visualization for the Web,O’Reilly,2017 年),并从那本书开始了 D3 的学习。当时面临的主要挑战是,HTML / CSS / JavaScript 对我来说都是全新的(尽管我知道如何用 R 语言编程)。因此除了 D3 外,我还必须学习这些语言;而且,由于我的无知,我都不知道 D3 的独特之处在哪儿,什么又叫原生 JavaScript(vanilla JavaScript),以致于常常会被卡在一些细枝末节上,不知道如何从网上搜索答案。总的来说,凭借极致的毅力,并确信当时所从事的是自己真正热衷的项目,才让我最终坚持了下来。不知不觉地,我对这些知识的理解也越来越透彻。我花了整整一年的时间才理解了 D3 的“进入-更新-退出”(enter-update-exit)流程,哈哈。

【问】除了 D3,您还使用其他可视化工具吗?D3 在您当前的数据可视化工作流程中处于什么位置?我看到您在项目中经常用到 R 语言。

【Nadieh】 D3 确实是我的主要工具。我 90% 的数据可视化项目都会在开始制作最终视觉效果时加载 D3。此外,我还会使用 JavaScript 和其他一些库,如用于处理颜色的 Chroma.js 以及用于处理噪声函数(noise functions)的 SimplexNoise。我总是先用 R 语言进行数据分析和数据准备,创建大量简单的图表,以便对这些数据产生独到而深入的理解。但我从不把这些图表作为最终的视觉效果。

  • Nadieh 精品项目《太空大战》(www.visualcinnamon.com/portfolio/space-wars/)

发表在《科学美国人》杂志的纳迪埃·布雷默的作品《太空卫星的可视化效果》(Visualization of satellites in space)

发表在《科学美国人》杂志的纳迪埃·布雷默的作品《太空卫星的可视化效果》(Visualization of satellites in space)


【问】再来聊聊您为 2020 年 11 月版的《科学美国人》创作的《太空大战》这部作品吧?

【Nadieh】 《太空大战》可视化展示了(当时)仍在太空中活动的所有卫星情况,主要目的是为了显示谁拥有这些卫星、以及可以在哪些轨道上找到它们。通过将每颗卫星视为单独的小圆圈,再按国家和轨道进行分组,可以非常直观地展示卫星本身的详细情况,如重量、年限、所属分类等等。

【问】能再介绍一下这个项目的创作过程吗?

【Nadieh】 幸好数据是由一位卫星专家收集的,所以我不需要做任何数据处理,只需要进行一些数据分析,就能了解我所掌握的情况。我在一个小册子上记录了一些想法。我知道要在国家和轨道分类上做文章。不过,关于每颗卫星的元数据实在太多,只能分别展示每颗卫星。也不知道从哪里冒出来的想法,但在某个时刻,我绘制了一幅用圆圈表示卫星的树形地图。当最初的想法逐渐明晰起来后,剩下的工作就分成了两个部分:一个是技术部分——如何在树形地图中使用圆圈;另一个是如何让整体设计看起来更美观。一开始效果看起来很糟糕,但后来我花了一些时间从最喜欢的科幻电影中寻找色彩灵感,才找到真正想要的视觉效果。

【问】在外人看来,您似乎是将 D3 的树形图的绘制手法与力导向图的布局相结合来生成这种可视化效果的,是这样吗?将不同模块的方法有机结合来创建前所未见的布局效果,这也是我最喜欢 D3 的原因之一。看了您在 Skillshare 平台的主讲课程《数据可视化:通过自定义图表获得美感与影响力》(Data Visualization: Customizing Charts for Beauty & Impact),里面也建议大家组合不同类型的图表。

【Nadieh】 没错,就是这样。我利用树形地图的方法来获取每组卫星的预定区域(用 x、y 坐标和宽度、高度来描述)。然后,在每个矩形区域内用力导向图的布局来进行模拟,以便对所有的圆进行定位,确保它们不会相互重叠。想要知道树状地图的每个方框的合理大小,需要用每个圆的表面积(与卫星重量成比例)与一个转换系数相加,有时还需要手动定义一些“神秘数值”(译注:magic number,意指程序中出现的没有任何注解或标明出处的数字),要么这儿改改,要么那儿调调。

你说得很对,能够创造性地使用 D3 也是我最喜欢它的原因之一!

代表卫星的圆圈根据树状地图中的控制区域和轨道类型分组,再利用 D3 的力导向布局计算它们的确切位置

代表卫星的圆圈根据树状地图中的控制区域和轨道类型分组,再利用 D3 的力导向布局计算它们的确切位置


【问】关于用 D3 为纸媒等印刷媒介生成静态可视化作品,您能再分享一下这方面的看法吗?我认为我们在这类问题上的讨论还远远不够!

【Nadieh】 我喜欢创建静态视觉效果,在创作过程中我也几乎一直在用 D3.js。对于印刷版视觉效果的创作,有一点很重要,那就是或许应该用 SVG 来完成创作,而不是使用 HTML5 的 canvas 画布。这样,杂志编辑们拿在手里的就是一个可以自由缩放大小的矢量文件。此外,字体和标题这些内容也可以进行调整(比如更换字体)和润色(比如修改文案措辞)。如果将浏览器中的视觉效果带入矢量编辑器,那么绝大部分样式都会被复制过来(我发现 Illustrator 在复制 CSS 样式与设置方面做得最好)。

【问】您与 Shirley Wu 合作完成的项目和《数据草图》一书(Data Sketches,由 A K Peters 出版社于 2021 年出版),启发了我们中的许多人,让我们在数据的处理方面更有创造力。您对初涉该领域的新人有什么建议吗?

【Nadieh】 听到这本书能带给大家启发和灵感,我感到无比欣慰。回想起来还有些奇怪,当初我和 Shirley 开始编著《数据草图》时,曾一度以为它可能是个只有我们和一些亲密的朋友才会去欣赏的愚蠢项目(silly project)呢。

至于建议,主要有两方面。一个是创作(to create)。尽可能多地去创作可视化作品。每创作一个新的作品,你都会学到新的东西(有时甚至是在不知不觉中);遇到新的问题或陷阱(pitfalls),要想出新的独具创意的解决方案来克服它们。当我回顾自己在这条道路上的旅程以及沿途创作的可视化作品时,都会清楚地看到自己是如何在编码和创意方面变得更加自信。这些经历和收获又进一步对我的创作产生积极的影响。

第二个建议,是尝试钻研你真正感兴趣的数据和主题,即便这些数据不是现成的,而是需要(手工)收集的。对自己真正感兴趣的主题进行数据分析,即使遇到技术上或设计上的困难,也会更容易坚持下去。这一点你也可以在《数据草图》一书中得到印证。在数据方面,我们从来不去选那条好走的路,而是一直尝试让兴趣来引导我们。几乎在所有情况下,数据都会不知不觉地出现在某个地方。

2.7 本章小结

  • D3 项目要有一个 Web 服务器才能正常运行。利用 VS Code 的 Live Server 扩展,可以简单快速地在本地开发环境中搭建一个 Web 服务器。
  • 有两种方法将 D3 库加载到项目中:一是在 index.html 中添加 script 标签;二是使用 NPM 模块引入 D3 库。为简单起见,本书前几章使用 script 标签的方法。
  • D3 既可以完整加载整个库,也可以按需加载必要的 D3 模块,从而提高项目性能。
  • 通过 script 标记加载文件和库时,script 标签生效的顺序与浏览器读取脚本的顺序相同。也就是说,引入 D3 的 script 标签,必须放到使用 D3 的 JavaScript 文件所对应的 script 标签前面。否则,浏览器将无法访问 JavaScript 文件中的 D3 方法而导致报错。
  • D3 使用 d3.select()d3.selectAll() 方法从 DOM 中选择元素。前者只返回第一个元素,而后者返回与其选择器匹配的所有 DOM 元素。
  • 作为参数传给 select()selectAll() 方法的字符串选择器,与 CSS 中的选择器相同,均使用标签名、类名、ID 或这些名称的组合来标识 DOM 元素。
  • append() 方法可以将新增元素添加为该选择集的最后一个子元素。
  • attr() 方法用于添加或修改元素的 attribute 属性。它接受两个参数:属性名称与属性值。
  • style() 方法可以设置和修改 DOM 元素的 style 属性(attribute),也需要传两个参数:样式的 property 属性名与属性值。
  • style() 方法可以设置行内样式,并覆盖通过外部 CSS 样式表及 attribute 视觉属性设置的样式。

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

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

相关文章

Linux云计算 |【第一阶段】ENGINEER-DAY4

主要内容: 配置Linux网络参数、配置静态主机名、查看/修改/激活/禁用网络连接、指定DNS、虚拟网络连接、虚拟机克隆、SSH客户端、SCP远程复制、SSH无密码验证(SERVICE-DAY5)、虚拟网络类型 一、网络参数配置 修改网卡配置文件主要是需要配置…

Spring Authorization Server 自定义 OAuth2 密码模式返回数据结构优化

前言 对接了自定义密码模式,但是返回的数据结构不符合要求 我们需要改成下面格式 开始 我假设你已经对接好了自定义密码功能,不会的话看下面文章 Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战(上…

23种设计模式之命令模式

命令模式 1、定义 命令模式:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作 2、命令模式结构 Command(抽象命令类):一般是…

【入门】基于DE2-115的My First FPGA 工程

1.1. 概述 这是一个简单的练习, 可以帮助初学者开始了解如何使用Intel Quartus 软件进行 FPGA 开发。 在本章节中,您将学习如何编译 Verilog 代码,进行引脚分配,创建时序约束,然后对 FPGA 进行编程,驱动开…

NVIDIA 完全过渡到开源 GPU 内核模块

目录 支持的 GPU安装程序更改将包管理器与 CUDA 元包配合使用使用 runfile使用安装帮助程序脚本包管理器详细信息apt:基于 Ubuntu 和 Debian 的发行版dnf:Red Hat Enterprise Linux、Fedora、Kylin、Amazon Linux 或 Rocky Linuxzypper:SUSE …

​探讨元宇宙和VR虚拟现实之间的区别​

在数字时代,人们对虚拟现实的兴趣与日俱增。在虚拟现实技术的推动下,出现了两个概念:元宇宙和VR虚拟现实。虽然这两个概念都与虚拟现实有关,但它们有着不同的特点和用途。在本文中,我们将探讨元宇宙和VR虚拟现实之间的…

UNiapp 微信小程序渐变不生效

开始用的一直是这个,调试一直没问题,但是重新启动就没生效,经查询这个不适合小程序使用:不适合没生效 background-image:linear-gradient(to right, #33f38d8a,#6dd5ed00); 正确使用下面这个: 生效,适合…

JavaScript与DOM的奇妙探险:从入门到精通的实战笔记

文章目录 JavaScript基本说明特点两种使用方式在script中写使用script标签引入JS文件 数据类型介绍特殊值 运算符算数运算符赋值运算符逻辑运算符:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bbf5c150699845af837d3c45c926e941.png)条件运算符 数组的…

通信协议_C#实现CAN通信

CAN协议 CAN(Controller Area Network)即控制器局域网络。特点: 多主网络:网络上的任何节点都可以主动发送数据,不需要一个固定的主节点。双绞线:使用双绞线作为通信介质,支持较远的通信距离。…

为Word文档注入魔法!Python批量替换多个文档的多个关键字,轻松搞定!

嘿,各位小伙伴们,大家好!有没有想过,如何在多个Word文档中批量替换多个关键字?不用担心,今天我来教大家一招,用Python轻松搞定这个问题!保证让你分分钟拥有处理文档的超级魔法~✨&am…

arm 内联汇编基础

一、 Arm架构寄存器体系熟悉 基于arm neon 实现的代码有 intrinsic 和inline assembly 两种实现。 1.1 通用寄存器 arm v7 有 16 个 32-bit 通用寄存器,用 r0-r15 表示。 arm v8 有 31 个 64-bit 通用寄存器,用 x0-x30 表示,和 v7 不一样…

AndroidStudio与手机进行无线调试

(一)、前提条件 一部手机一条USB数据线一部电脑手机和电脑连接到同一个 Wifi开启手机的USB调试功能开启手机的无线调试功能 (二)、操作步骤 1、 将手机和电脑用USB数据线连接 2、 打开 终端,输入 adb devices ,查看手机和电脑是否连接成功。如下图: 2、…

Mac电脑硬盘无法读取怎么办 Mac硬盘读取慢会导致电脑卡吗 Paragon NTFS 激活码

Mac电脑作为众多用户的工作与生活伙伴,其稳定性和效率至关重要。然而,当遭遇硬盘无法读取或读取速度缓慢的问题时,这无疑会给用户带来极大的不便,影响日常操作与数据访问。下面我们来看看Mac电脑硬盘无法读取怎么办,Ma…

Kotlin性能:runCatching、try-catch块、无异常处理耗时比较

Kotlin性能&#xff1a;runCatching、try-catch块、无异常处理耗时比较 fun main(args: Array<String>) {val a 1.1fval b 2.2fval n1 System.nanoTime()val m1 System.currentTimeMillis()runCatching {cal(a, b)}val n2 System.nanoTime()val m2 System.currentT…

python中format函数和f-string详解

Python 中的 format() 函数是一种字符串格式化的方法&#xff0c;通过花括号 {} 来定义占位符&#xff0c;并通过 format() 方法中的参数来替换这些占位符。这种方法非常灵活&#xff0c;可以处理多种数据类型&#xff0c;并且可以通过索引、关键字或者属性名来访问对象的属性。…

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.2新一代信息技术及应用-2.2.3大数据与2.2.4区块链

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

实战项目:仿muduo库实现并发服务器

目录 项目初始与项目演示HTTP服务器基础认识Reactor模式基础认识单Reactor单线程模式认识单Reactor多线程模式认识多Reactor多线程模式认识 目标定位总体大模块划分server模块的管理思想Buffer子模块Socket子模块Channel子模块Connection子模块Acceptor子模块TimerQueue子模块P…

记录些Spring+题集(9)

在网络应用开发中&#xff0c;Cookie、Session 和 Token 是常见的用于管理用户状态和身份验证的机制。 Cookie、Session、Token 的区别 这三个概念的产生与 HTTP 是一种无状态协议密切相关。在 HTTP 中&#xff0c;每次客户端与服务器之间进行通信时&#xff0c;服务器无法直…

8月长沙学术会议:经济金融发展国际会议(ICEFD 2024)

经济金融发展国际会议&#xff08;ICEFD 2024&#xff09;将于2024年8月20-22日在长沙盛大举行。本次会议汇聚了国内外众多高校、科研机构、企业界及其他相关领域的专家学者&#xff0c;共同探讨经济金融发展的新趋势、新挑战和新机遇。 长沙&#xff0c;这座历史悠久的文化名…

细说MCU用DMA控制ADC采样和串口传送的实现方法

目录 一、建立工程 1.相同的配置 2.配置ADC 3.配置DMA 二、代码修改 1.定义存储ADC采样结果的数组 2.启动ADC与定时器 3.编写主程序代码 4.重定义回调函数 5.查看结果 三、修改DMA模式 1. 修改DMA模式为Circular 2.查看结果 采用DMA(Direct Memory Access&#xf…