干货|d3创始人又一力作:不仅能在线写D3.js,还能让你写的更出色

说起可视化工具,D3.js(以下简称d3)无疑占据了重要的地位。然而,伴随d3学习的往往是无数示例网页以及相对复杂的测试环境,初学者不得不学着配置本地服务器、引入库、不停打开控制台并复制粘贴各种代码,才能画出自己的第一个数据图。此外,由于d3的绘图原理比较基层,初学者未必能够掌握其代码结构,而只是重复于各种复制粘贴的工作。如果能够有一个可以分步的、能够输出实时结果并及时报错的工具,d3的学习无疑会简单不少。

Observable就是一个这样的工具。这是一个可以在线编辑javascript的网站,是d3创始人Mike Bostock的又一力作。


Observable标志

Observable网址:https://observablehq.com

一、observable简介

单看项目的样子,Observable和大名鼎鼎的jupyter notebook差不多,代码是以一个个“单元”(cell)为基本单位运行的,每个单元可以被单独执行。


大部分时候,需要给每个单元一个名字,使得该单元内容可以被其他单元引用。


但Observable的最大亮点是,它允许使用者直接使用各种各样的开源js库,只需一句代码:

即require(‘库名’)。


这个require命令会自动搜索并引用unpkg.com这个网页中的库,此功能使得Observable对于可视化工具的支持程度非常高,也为我们在线编辑d3打下了基础。

二、写d3前的准备工作

首先当然是require d3的库


“d3@5”的意思是d3 version5,不加版本号的话将会默认最新版本。

在这里稍微说一下d3 version4和version5(以下简称v4和v5)的区别。V4与v5的主要区别即在于加载数据上(如下图,同时请求一个csv文件)


简单的说,由于v5使用了新的异步方法,其得以直接将数据储存在一个变量里随拿随用,使得代码逻辑更加清晰。但使用新方法的副作用就是很多新的关键字搞不懂(比如上面的”await”),使用起来可能有很多坑。

然而,Observable的分步请求解决了这个问题,它的“依次执行”的特点,使得使用者得以将多个数据“保存”在对应变量中随取随用,而不依赖ES2017规范中的关键词(例如promise与await)(如图)。


因此,在Observable上写d3的准备工作只需两步

1、require d3;

2、直接用d3的方法将数据赋予变量(如上图的例子)。

需要注意的是,因为是在线编辑器,所以数据最好已经上传到网络上了,请求数据用的url也最好是绝对链接(github就可以办到)。

三、画图(请一定要点开看例子)

画图的代码组合同我们平时直接写有些许区别,但理解这些区别有助于使d3水平发生质的飞跃。

首先,由于Observable“代码单元”的属性,决定了其每个单元都有单独的任务,顺利的让每个单元执行自己的任务需要最基本的“函数式编程”的思想。其次,这种“单元”也可以培养“规定常量”的意识。

以画一张简单的折线图为例:https://observablehq.com/@d3/line-chart

一张折线图需要x位置的映射、y位置的映射、绘制x轴、绘制y轴以及画线,这是五个单独的函数,最后是将这些函数画到画布上的“画画”的函数(对svg或者canvas的直接操作)。

需要注意的是,画线的函数只是规定了线的走向,“用笔画线”这一步是在“画画”函数里面操作的。而x轴与y轴的绘制,则是相当于在一张小纸条上画好,再“贴在”画布上。

每一个Observable写的d3项目中,总有一个“画画”的函数,只有它执行之后会将内容画出来。需要注意的是,为了将内容画出来,需要返回画布的内容,svg用“selection.node()”(这是d3的自带方法,返回选择器中第一个非空值),而canvas用selection.canvas。

四、使用Observable的优缺点

使用Observable对于新手是非常好的锻炼,分块的结构可以使得代码结构更为清晰,甚至培养编程思想。方便的库引用也使得编程者可以针对可视化进行更多的探索。在线的特征也方便保存与修改。

值得一提的是,Observable拥有诸多优秀教程与示例作品,完全可以当作学习论坛而使用。而其类似github的fork功能使得人人可以创建账号将优秀的代码片段复制过来自行修改。Observable还提供了诸如直接保存svg、直接保存csv等方便功能。

Observable官方教程:https://observablehq.com/@observablehq/observable-user-manual

D3官方Observable账号:https://observablehq.com/@d3

然而Observable也存在诸多缺点,最大的缺点即是导出复杂。我会再专门写一篇文章讲如何将辛辛苦苦做出来的图用在自己的网页里,但总体来讲导出体验一般。

此外,其代码样式实现高度依赖js,不符合代码与样式分开的思想,在自己网页的使用中可能会有意想不到的麻烦。

总而言之,Observable并不仅仅是一个d3在线编辑器,它功能强大,使用方便,并且社区有诸多大佬出没,非常适合学习。它的分步骤的内在思想也会潜移默化的影响使用者的编程习惯。

by 李奕

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容