D3.js 入门

前言

好一段时间没有发表文章了, 虽然也有不断的在写东西, 总是认为产出更偏向于笔记, 似乎并不值得分享与发表.

但知识这种东西仿佛只有表达出来才知道其对与错. 同样, 在表达的过程中也能以一个认真负责的态度来让自己了解的更多.

也许...

让更多的人与我对某件事物的了解达成共识, 就是所谓知识的传递吧.

然而, 错误的认知在传递中总会遇到很多的阻碍的, 而那也就是进步的空间.

我认识到, 写东西的意义就在于此...

D3: Data-Driven Documents

d3js 是一个可以基于数据来操作文档的 JavaScript 库. 可以帮助你使用 HTML, CSS SVG 以及 Canvas 来展示数据. D3 遵循现有的 Web 标准, 可以不需要其他任何框架独立运行在现代浏览器中, 它结合强大的可视化组件来驱动 DOM 操作.

D3.js 可以做什么?

应该有非常多的同学使用 D3 是为了做数据可视化. 即常见的统计图, 报表等. 当然还有不常见的(不常见到看都看不懂的那种...)

数据可视化是什么?

假如我们把股票中的这种那种的图表都去掉, 全部用数字来代替, 正常来说, 绝大部分人是一脸懵逼的, 完全无法简单的分辨出走势的关系.

而正是有了数据可视化的帮助, 我们(他们)在分析数据时才会事半功倍 !

总之呢, 在当下这种大数据量产出的环境下, 作为重中之重的数据的可视化工作亦是非常有意义的.

cdn 引入

<script src="https://d3js.org/d3.v5.min.js"></script>

d3 基础: 元素选择 & 数据绑定

元素选择的方式有两种:

  • d3.select(selector)
  • d3.selectAll(selector)

selector 与 document.querySelector() 一致

两个函数都返回一个元素选择集合, 并且该集合同样支持链式调用元素选择函数.

d3.select('body').select('div').selectAll('span');

数据绑定的方式也有两种:

  • datum(单个数据): 依次绑定一个数据源到选择的元素集
  • data(数组|类数组): 依次绑定一组数据源到选择的元素集

用法及效果

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>data&datum</title>
  </head>

  <body>
    <ul id="datum">
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
    </ul>

    <ul id="data">
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
    </ul>

    <script src="../../source/d3.js"></script>
    <script>
      let str = 'bei';
      let datumLis = d3.select('#datum').selectAll('li');
      datumLis.datum(str);
      datumLis.text((item, idx) => `${idx}: ${item}`);

      let dataLis = d3.select('#data').selectAll('li');
      dataLis.data(str);
      dataLis.text((item, idx) => `${idx}: ${item}`);
    </script>
  </body>
</html>

输出

0: bei
1: bei
2: bei
3: bei
4: bei

0: b
1: e
2: i
3: undefined
4: undefined

通过观察, d3.data()/datum() 同样会返回一个 Selection 对象, 也就是选择集对象.

该对象包含有两个属性:

  • _groups: 匹配命中的所有节点
    0: NodeList(5)
      0: li
        __data__: "b"
      1: li
      2: li
      3: li
      4: li
    length: 5
    __proto__: NodeList
    length: 1
    __proto__: Array(0)
    
  • _parents: 父节点信息
    0: ul#data
    length: 1
    __proto__: Array(0)
    

可以看到, Selection._groups[0][0].__data__ = 'b'. 成功绑定的元素会在其节点上添加(真的添加到 DOM 上了) __data__ 字段, 表示已经成功绑定.

然而这个绑定并不是双向的, 我在浏览器修改了 __data__ 字段的值之后, 页面并没有任何响应.

作为一个先接触 MVVM 的玩家来说, 这种绑定给我一种 物理绑定 的感觉.

来说一下上面 demo 的关键代码:

dataLis.data(str);

data(类数组) 函数用于绑定一个数组或类数组. 比如说 data([1,2,3,4,5]), 那么会将 Selection._group[0] 的每个元素的 __data__ 一次给上数组的对应值. 假如是一个类数组 data('0X032'), 那么会将 '0X032' 作为 ['0','X','0','3','2'] 处理.

直接传递一个 number 给 data 是不行的哦, data(0X032) 无效.

dataLis.text((item, idx) => `${idx}: ${item}`);

这个的话, 大家应该很好懂, text() 方法接收一个回调, 并且 text() 方法的内部有一个 迭代或者循环体, 他会负责调用回调函数, 并且将每次的迭代对象和索引传递给回调函数.

迭代对象就是 Selection._group[0] 所对应的每个元素的 __data__.

索引就是 Selection._group[0] 所对应的每个元素的 索引.

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

推荐阅读更多精彩内容

  • [译]D3.js 之 d3-selection 原理 译者注 原文: 来自 D3.js 作者 Mike Bosto...
    ssthouse阅读 722评论 0 0
  • D3.js 入门教程(连载) 近年来,可视化越来越流行,许多报刊杂志、门户网站、新闻媒体都大量使用可视化技术,使得...
    极客学院Wiki阅读 12,330评论 2 25
  • Data Visualization with D3 D3: SVG中的jQurey 1. Add Documen...
    王策北阅读 757评论 0 2
  • 本来一直是使用echarts来画图的,结果画好了以后,公司又要使用d3来画,没有对它进行特别的深入,只是了解了一下...
    miner敏儿阅读 513评论 0 0
  • 根据 D3.js API 入门 画一个简单的柱状图 创建图表 【 d3-selection 】 计算x,y...
    Pretty_Boy阅读 1,292评论 4 1