【D3.js in Action 3 精译_030】3.5 给 D3 条形图加注图表标签(下):Krisztina Szűcs 人物专访 + 3.6 本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容)

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

文章目录

  • 3.5.1 人物专访:克里斯蒂娜·苏茨(Krisztina Szűcs)
  • 3.6 本章小结

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

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

译者按
秉承“他山之石,可以攻玉”的创作理念,本章同前面两章一样,在章节末尾附上了一篇人物专访。本次接受访谈的数据可视化名家是一位来自匈牙利的著名平面设计师 克里斯蒂娜·苏茨,她以其在设计和数据可视化方面的独特视角和创新方法闻名于世。接下来就放松放松,看看她在学习 D3 的时候都踩过哪些坑,又有什么样的经验之谈给到大家——

3.5.1 人物专访:克里斯蒂娜·苏茨(Krisztina Szűcs)


苏茨(Szűcs) 是数据可视化领域的知名设计师 1

【问】能否介绍一下您的背景,以及您是如何发现 D3.js 的?

【Szűcs】 好的。我并没有编程相关的背景,我拿的是平面设计的硕士学位,只是在 Flash 盛行的时代接触过一些 ActionScript。起初,我用的是 Processing 2 来进行数据可视化的创作;但当我在 2012 年上网时,发现几乎人人都在尝试这个叫 d3.js 的新鲜事物,并且它还非常适合做数据可视化,我这才决定试着去学习它的。

【问】那您是怎样学习 D3 的呢?其间都遇到过哪些主要困难,后来又是怎么克服它们的呢?

【Szűcs】 我对学习新的工具库或者语言其实并不很热衷,反倒更喜欢只学一门,然后一直用下去(哈哈)。当一个崭新的新事物闪亮登场时,我通常会很不高兴,因为它貌似成了业内的新标配,而我自己也再无法将它拒之门外,不得不投入时间和精力去学习了解它了。

因此,当 D3.js 出现时,每个人都开始谈论起它来。我那会儿也已经知道自己想要创建的,是具有交互效果的数据可视化作品,所以就做了个决定:学习 D3 是我当时必须得拿下的一件事,也是唯一的一件。

我记得这比我预想的要困难得多。我按照 Scott Murray 编写的教程《Web 交互式数据可视化》(Interactive Data Visualization for the Web) 进行学习,然后尝试将所学应用到自己的项目中。一开始按照教程的每一步来操作,这些知识都很有用;可当我最终尝试用自己的数据来应用这些示例时,却遭遇了失败——因为大多数情况下我的真实数据集都太复杂了,在让这些数据与 D3.js 有机结合的过程中,我着实遇到了不小的困难。

此外,我从一开始就想制作大型的、与众不同的视觉效果,而当时并没有专门的教程,所以一时也很难弄明白如何从简单的柱状图过渡到我脑海中那些非常规的复杂设计。我也只能反复练习与尝试,直到每个部分都和我想象中的效果一致才肯罢休。

【问】除了 D3 之外,您还用过其他可视化工具吗?在您当前的数据可视化工作流程中,D3 大概处在一个怎样的位置?

【Szűcs】 我用过像 Figma 这样的设计工具来设计我的可视化作品外观;同时还用过 ExcelPython,主要是进行一些数据集的处理或者收集方面的工作。

在使用设计工具时,我会抱着设计师的心态,先不去想那些在实际开发可视化作品时必须要面对的限制条件、或者不得不解决的所有难题。这有助于我避免限制自己的想法,从而构建出更好的视觉效果。当视觉效果以静态图片的形式呈现出来后,我就会切换到“开发者思维”,尝试重新创建我在设计稿中看到的一切。有时我会做一些调整,但当我设计的东西在开发时遭遇挑战,我会强迫自己先去解决代码方面的难题,而不是先给编程一路开绿灯,回头再把设计改成简单的东西。我还发现,对我来说这是学习 D3.js 的最佳方法。

【佳作赏析:动画版体坛赛事(详见:https://krisztinaszucs.com/)】

图 1 国际泳联 2022 世锦赛男子 200 米仰泳比赛的动画演示截图

【图 1 国际泳联 2022 世锦赛男子 200 米仰泳比赛的动画演示截图】


【问】和我们说说您创作的这部作品(Animated Sport Results,动画版体坛赛事)吧。

【Szűcs】 我当时本来一直打算为 2020 年奥运会创作一部可视化作品。国际泳联 2022 年举办的这次世锦赛刚好就是个吸引了很多人关注的一项盛大国际体育赛事,并且里面的赛事数据资源也是现成的。我想,要是能创建一个与比赛相关的可视化作品,那么今后就可以在其他体育赛事(比如世锦赛)、甚至其他使用类似计分规则的体育项目中多次复用了。

我也希望观众能重温比赛的精彩,所以没有一开始就公布最终结果,而是慢慢地展示比赛的进程。

我很喜欢 Chartball.com 3 网站和《纽约时报》上类似的可视化设计,它们都是我这部作品的灵感来源。

【问】您能再分享分享下面这部作品的创作过程吗?

【Szűcs】 刚开始着手这个项目时,我就明确了自己要创作的是一部动画版的作品,并且主打极简主义风格。作品中要带有一抹红色,这让我在脑海中联想到了日本(2020 年奥运会就是在东京举办的)。

图 2 Krisztina Szűcs 为其作品《Animated Sport Results》准备的可视化设计草图

【图 2 Krisztina Szűcs 为其作品《Animated Sport Results》准备的可视化设计草图】


【Szűcs】 然而我并不知道具体要为哪项体育赛事构建可视化项目,所以就依次为跳高、跳远、标枪、铁饼、跑步、室内自行车……等不同的体育项目绘制了许多草图,最后还为水球项目设计了一版和得分进度相关的可视化效果(即上图右下角那幅)。不久我就意识到,得分进度可视化将会是我复用频率最高的一个设计,一旦对外观感到满意,我就开始着手写代码了。

当然,当时离奥运会还有几个月,我还没拿到任何数据,所以用了上届奥运会的比赛成绩作为样本数据。此外,我还给自己创建了一个以可视化主体效果为中心的用户界面,以便在调色板或数据集之间快速切换。

我在奥运会开幕的前几周便做好了准备,刚好欧洲足球锦标赛也在那段时间举行。尽管我的可视化作品都是为进球数在十个以上的赛事设计的,但还是准备用足球比赛的结果来进行预演。我加载了足球比赛的数据文件,即使只有 1 ~ 3 个进球,可视化也能正常工作。其间我还做了些改进,引入了点球得分相关的可视化效果。

图 3 根据 2021 年欧洲足球锦标赛的结果而尝试创作的得分情况可视化效果截图

【图 3 根据 2021 年欧洲足球锦标赛的结果而尝试创作的得分情况可视化效果截图】


【Szűcs】 但奥运会开赛后,我无法拿到最新的比赛数据,因为数据都是以 PDF 格式发布在官方网站上的。这期间由于从 PDF 获取数据是一个相当繁琐的手动过程,这是我始料未及的,因此只成功制作并发布了两三个动画作品。这次经历也让我明白,应该去寻找更好的数据源进行创作。所幸其他赛事,比如世锦赛或体育协会的网站可以提供质量更好、也更易获取的数据源。在奥运会结束后,我拿到了更好的数据源,才创作出了更多这样的动画作品。

【问】您是用 D3 创作的这些动画,还是用了其他的什么库或者工具?

【Szűcs】 我只用了 D3.js,但为了导出图片,我还用了录屏软件 ScreenToGif 来录制屏幕。

【问】您的作品风格极具辨识度,它们是怎么逐步演变过来的呢?在数据可视化领域有没有什么诀窍可以树立像您的作品这样的影响力(your voice)呢?

【Szűcs】 我在大学期间学习的平面设计知识无疑为我打下了坚实的基础,但当下的平面设计趋势(印刷、品牌设计、包装设计、排版等等)也对我的设计风格产生了很大影响。每天我都会浏览平面设计相关的网站来不断捕捉灵感。每当发现非常喜欢的视觉元素或设计图案,我就会立即开始思考“这可能是个不错的可视化应用(dataviz)”。

当然,并不是所有的视觉趋势都可以用图表来表示;但我在努力弄清怎样借助 D3.js 来重塑某些特定而又不寻常的外观效果的过程中,收获了很多东西。

【问】您在学习 D3 和创建个人项目方面,有没有什么想与读者朋友们分享的技巧呢?

【Szűcs】 要注意将设计和编码阶段分开(Separate the design and the coding phase in your process)。先设计出最终的外观效果,与此同时要主动屏蔽那些让你觉得后续开发阶段实现起来会有多么困难的任何想法。这样,才能不断遇到需要解决的新问题,从而学到很多新技巧。

如果设计不是你的强项,作为日常练习也可以随时去搜寻一些优秀的可视化作品,然后试着从头开始重新创作一遍。


3.6 本章小结

  • 在数据可视化中,我们主要处理两种数据类型:定量型数据和定性型数据。定量型数据是数字信息,如体重或温度;而定性数据通常是文本信息,如国家名称或电影类型。
  • 作为 D3 开发人员,我们需要处理不同格式的数据集。最常见的是表格格式,如 CSV 文件和 JSON 文件中的 JavaScript 对象;此外,数据也可以按照不同层次、网络结构或者地理信息可视化的特定方式进行组织。
  • D3 提供了将特定格式的数据集加载到项目中的工具函数。例如,d3.csv()d3.json() 函数可分别加载 CSVJSON 格式文件。在加载数据时,D3 会将其转换为对象数组。
  • 加载外部数据集时,我们通常需要确保数据(尤其是数值型数据)格式正确。d3.csv()d3.json() 的回调函数可以逐行访问数据集,是执行类型转换和其他数据操作的理想场所。
  • 数据加载是一个异步过程,这意味着加载时浏览器会继续读取与执行脚本:
    • 在操作数据前,必须等待数据完成加载。为此,可以使用 JavaScript 期约接口中的 then() 方法;
    • then() 方法的回调函数可在加载结束后访问整个数据集。然后,可以在构建可视化效果前进一步测量和重构数据。
  • 数据绑定模式产生的 SVG 元素数量与数据(单个数据点或者表格数据集中的行)数量相同:
    • 数据绑定模式由三个链式调用的方法组成:selectAll()data()join()
    • 使用数据绑定模式生成 SVG 元素后,就能通过内联函数(译注:inline functions,即访问器函数 accessor)访问与每个元素绑定的数据项。
    • 绑定到元素上的数据也会传递给它的后代元素。
  • D3 比例尺能将数据集中的值转换为用于指定 SVG 元素样式的各类属性值,如尺寸大小、位置及颜色:
    • 根据输入输出值是离散型还是连续型,可以将 D3 比例尺分为四个系列;
    • 线性比例尺从连续型定义域获取输入,并从连续型值域中返回一个输出值。其输出与输入值成正比。线性比例尺广泛应用于 D3 项目,例如计算条形图中矩形元素的长度;
    • 分段比例尺从离散型定义域中获取输入,并从连续型值域中返回一个输出值。这类比例尺对于在条形图的可用空间内排布各矩形元素特别好用。
  • 对 SVG 分组元素进行平移(translation)将影响其内部所有的后代元素。
  • 标签由 SVG 文本元素(text)构建。每个文本元素必须使用 xy 属性单独定位;还可以使用 text-anchor 属性(attribute)设置文本右对齐。

  1. 更多专访人物信息,可参阅 Krisztina Szűcs 的个人网站:https://krisztinaszucs.com/ ↩︎

  2. Processing 是一个基于 Java 的开源编程语言和环境,旨在通过简化代码来帮助艺术家和设计师创造视觉艺术和交互作品。更多详情,详见 Processing 官方:https://processing.org/ ↩︎

  3. Chartball 是一个专注于体育统计数据可视化的知名网站,提供直观的图表和分析工具,尤其是篮球和棒球相关的赛事数据。详见网站首页:https://www.chartball.com/ ↩︎

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

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

相关文章

《大规模语言模型从理论到实践》第一轮学习笔记

第一章 绪论 本章主要介绍大规模语言模型基本概念、发展历程和构建流程。 大规模语言模型(Large Language Models,LLM),也称大语言模型 或大型语言模型。 1.1 大规模语言模型基本概念 1.语言模型(Language Model&a…

Python脚本分类和代码举例

Python是一种强大且灵活的编程语言,被广泛应用于数据分析、Web开发、自动化、人工智能等领域。在不同的应用场景下,Python脚本可以被分类为多种类型。本文将深入分析Python脚本的分类,同时提供相关代码示例,帮助读者理解和应用这些…

【CF2021E】Digital Village(All Version)

题目 给你一张 n n n 个点 m m m 条边的无向图,有 p p p 个关键点。你需要选择 k k k 个点染黑,使得这 p p p 个关键点到这 k k k 个黑点的代价和最小。定义代价为两点之间边权最大的边的最小值。 你需要求出 k 1,2,…,n 的所有答案 E1 n,m,p&l…

Mapsui绘制WKT的示例

步骤 创建.NET Framework4.8的WPF应用在NuGet中安装Mapsui.Wpf 4.1.7添加命名空间和组件 <Window x:Class"TestMapsui.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winf…

Python物联网编程:10个IoT设备通信的脚本

今天我们要聊的是如何使用Python编写脚本来实现10个IoT设备之间的通信。物联网&#xff08;IoT&#xff09;是一个充满无限可能的领域&#xff0c;它将日常设备连接到互联网&#xff0c;使它们能够互相通信、收集数据并做出响应。Python以其简洁易懂的语法和强大的库支持&#…

浅谈 WMS 的应用行业_SunWMS智慧仓储物流系统

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 仓库管理系统&#xff08;WMS&#xff09;已经成为众多行业优化运营、提高效率和竞争力的重要工具。WMS 的应用范围广泛&#xff0c;涵盖了制造业、零售业、电商、…

调用第三方接口

目录 一、分析给出的接口文档 二、请求体格式之间的区别 三、示例代码 一、分析给出的接口文档 一般的接口文档包括以下几大部分&#xff1a; 1、请求URL&#xff1a;http://{ip}:{port}/api/ec/dev/message/sendCustomMessageSingle 2、请求方式&#xff1a;POST、GET等 3、…

基于SpringBoot+Vue的超市管理系统设计实现(协同过滤算法、图形化分析)

&#x1f388;系统亮点&#xff1a;协同过滤算法、图形化分析&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框…

主数据驱动的数据治理高清书籍领取

主数据驱动的数据治理 原理、技术与实践 高清版本电子书领取 绝对高清版本的电子书&#xff0c;抓紧来获取吧&#xff5e;&#xff5e;&#xff5e;

【宽字节注入】

字符编码 url 编码 GBK编码 utf8 编码 宽字节注入 php中的转译函数 宽字节注入介绍 练习 正常输入没有回显&#xff1a; 没有回显 usernameadmin&passwordadmin 闭合单引号&#xff0c;依旧没有回显 usernameadmin and 11%23&passwordadmin利用宽字节尝试闭合,依旧…

DIFY上使用多种大语言模型(MindCraft API)

注册MindCraft并创建API KEY 首先我们在智匠MindCraft上注册账号并创建API KEY&#xff0c;参考接口调用文档&#xff0c;查看我们能调用哪些模型。我们可以看到这个开发平台上整合了主流的大语言模型&#xff0c;并且是兼容openai接口的。 进入DIFY的设置界面 然后我们在DIFY上…

ArcGIS属性表怎么连接Excel表格?

ArcGIS中&#xff0c;属性表是存储空间要素非几何特征属性的重要工具。有时&#xff0c;我们需要将这些属性与外部数据&#xff0c;如Excel表格中的数据进行连接。以下是如何在ArcGIS中实现这一过程的步骤。 要把Excel表里的数据导入到ArcGIS里的地图数据里面&#xff0c;对数…

C语言 | Leetcode C语言题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; const int dx[4] {0, 1, 0, -1}; const int dy[4] {1, 0, -1, 0};int dfs(int x, int y, int** grid, int n, int m) {if (x < 0 || x > n || y < 0 || y > m || grid[x][y] 0) {return 1;}if (grid[x][y] 2) {return 0;}g…

统信服务安装mysql8.4版本,二进制文件

一&#xff1a;建立MySQL用户和用户组 sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql 二&#xff1a;下载MySQL安装包 MySQL :: Download MySQL Community Server (Archived Versions) 找对应的版本 三&#xff1a;解压二进制安装包&#xff0c;从命…

【Linux复习】指令

文章目录 1.>2. cat3.系统命令bash和shell和kernel权限只被认证一次粘滞位引入前提知识场景解释为什么普通用户&#xff08;无w权限&#xff09;可以删除文件&#xff1f;为什么普通用户通过sudo设置文件权限为000后仍能删除文件&#xff1f; 结论 粘滞位是干什么的&#xf…

8款宝藏手机app,适配安卓和苹果手机

好用的手机APP太多&#xff0c;差点挑花了眼&#xff01;今天来分享4款苹果手机和4款安卓手机上的宝藏软件&#xff0c;看看你喜欢哪一款~ IOS系统APP 1.搜图神器 一款拥有海量图片资源的图片搜索神器&#xff0c;它聚合海内外知名搜索引擎&#xff0c;想要图片直接搜索就行…

Vue3 响应式数据

ref 基本数据类型响应式 语法&#xff1a;let xxx ref(初始值)。**返回值&#xff1a;**一个RefImpl的实例对象&#xff0c;简称ref对象或ref&#xff0c;ref对象的value属性是响应式的。注意点&#xff1a; TS中操作数据需要&#xff1a;xxx.value&#xff0c;但模板中不需要…

第三届“讯方杯”大赛常见问题解答

9月20日&#xff0c;第三届“讯方杯”全国大学生信息技术应用及创新大赛正式拉开帷幕。自大赛报名启动以来&#xff0c;全国各大高校热烈响应、广泛参与。为了更好地服务于各参赛团队&#xff0c;大赛组委会针对收集到的各类常见问题&#xff0c;整理了热点问答集锦&#xff0c…

大型公共建筑用电管理集中监测平台功能介绍

在当国家对能源管理和环境保护日益重视的背景下&#xff0c;相关政策不断出台&#xff0c;推动企业用能向智能化管理、数字化管理方向转型。电能因为方便传输、易于转换、便于控制等特性&#xff0c;成为广大企事业单位生产、办公主要的能量来源。双碳背景下&#xff0c;由于电…

动态内存管理练习题的反汇编代码分析(底层)

目录 1.练习题回顾 2.反汇编代码 3.分析 lea指令的作用 1.给普通指针赋值 反汇编显示 2.给结构体指针赋值 反汇编显示 mov 指令的作用 1.取普通指针指向地址的值(等价为C语言的*) 反汇编显示 2.取结构体指针指向地址里的值 反汇编显示 3.总结->的作用 4.回到…