hello,data!

在进入d3.js之前,我们先用一个小例子回顾一下将数据可视化的基本流程。

  • 任务

用横向柱状图来直观显示以下数据:

  1. var data = [10,15,23,78,57,29,34,71];

简单地思考一下,要完成这个任务有两个问题需要解决:

  1. 什么可视元素来表现横向柱
  2. 数据对应到可视元素的什么属性

这个不算困难,我们使用HTML的DIV元素来实现,代码参见http://***/course/54fd40cfe564e50d50dcf284/:快速入门第一页

试着改变一下示例代码中变量data的内容,体会一下数据驱动 的含义。

数据可视化与d3.js

数据图形的方式表现出来,这个过程就是数据可视化

没错,一图胜千言。我们很难从枯燥的数字中发现规律与异常,但很善于从图形 中发现模式。随着人类所拥有数据规模的日益扩大,数据可视化逐渐成为一个重要 的不可或缺的技术手段。

d3.js是一个优秀的数据可视化库,可以让我们方便快捷地实现数据到图形的变换。 不过,在开始后续的教程之前,先打个预防针,希望你不要误解d3.js :

  • d3.js不是一个图形绘制库

很多人惊诧于这一点,但不得不提。d3依赖于标准的web技术来绘制可视化元素,比如 HTML、SVG、CSS。使用d3需要我们对这些标准技术有基础的了解。

  • d3.js是一个基于集合概念的DOM操作库

d3不是图形绘制库,但它对DOM操作进行了封装。和jQuery类似,d3依赖于选择符选 中一组元素,建立一个集合,然后使用集合对象的方法操作DOM。

  • d3.js的大量功能集中在数据处理方面

要将数据映射到图形,有很多琐碎的工作,比如数据范围的变换、插值的计算、布局的 计算等等。d3.js的大量功能是集中在这样的数据处理方面的。

  • d3.js的核心是对数据可视化元素的匹配

d3将数据可视化抽象为数据与可视化元素的匹配,一个数据对应一个可视化元素,一个 数值对应一个可视化元素的属性。d3封装了这个匹配的复杂过程,让我们得以简单的 通过声明数据和可视化元素来完成数据可视化的任务。

d3的四把斧:hello,d3

在HTML文件中引入d3.js后,我们就获得了一个全局变量:d3。d3.js 的功能就通过这个对象暴露出来。

我们使用d3的API重写前面的示例,代码已经预置到→_→。

这个例子展示了d3.js实现数据可视化的典型理念:基于集合运算的 声明式数据可视化。

请你注意上图中使用d3时经典的四把斧:d3总是要求使用者声明两个集合:DOM对象集数据集, 并根据集合运算实施数据与DOM对象的匹配,最后通过修改匹配的DOM对象来获得 可视化的效果。

d3第1斧:声明DOM对象集

d3的数据可视化流程总是从选中一组DOM元素建立一个集合对象开始。 在示例中,我们通过:

  1. var selection1 = d3.select("#barChart").selectAll(".bar");

试图在文档DOM树中选择div#barChart中的所有div.bar。 我们将这一步返回的DOM集合保存到变量selection1中。

你应该会注意到,这是一个空集合

这有点意思。

  • d3允许声明一个空集合

在jQuery中,如果我们的选择符没有选中任何HTML元素,那么后面的所有操作都没有意义了。 但是,d3允许我们选不中任何元素来来建立一个空集合

因为,d3还有第2斧,用数据来影响这个空集合。

size()方法返回集合中所有DOM元素的数量。在→_→的示例中,你可以看到,selection1 确实是一个空集合:它有0个DOM元素。

d3第2斧:声明数据集

我们在第一步返回的selection1上执行data()方法声明要展示的数据:

  1. var selection2 = selection1.data(data);

我们知道这个数据集不是空的,它有8个数据项。在这一步,d3将数据集和DOM 对象集进行比较,返回一个新的集合selection2

我们看到,selection2的DOM元素数量也是0。

匹配计算

data()方法执行时对数据集和DOM元素集进行了匹配计算, 直接返回的结果就是两个集合的共有部分。由于DOM元素集是空的,所以结 果一定也没有任何DOM元素:

但是,匹配计算的结果有两个重要的方法,让我们可以获得数据集合DOM元素集的 差异在哪里:

  • enter() : 获得数据集中比DOM元素集中多出来的数据
  • exit() :获得DOM元素集中比数据集中多出来的数据

示例(http://***/course/54fd40cfe564e50d50dcf284/:快速入门第五页)显示了通过data()操作,目前获得的选择集中成员数目还是0。

d3第3斧:获得结果集

继续使用集合的enter()方法,我们可以获取缺失的DOM对象集合(以数据集为 对比基准):

  1. var selection3 = selection2.enter();

由于原始DOM集合为空,而数据集有8项,那么selection3中也将有8项描述8个缺失的 DOM对象:

d3第4斧:实施DOM操作

使用集合的append()方法,我们创建缺失的DOM对象:

  1. var selection4 = selection3.append("div");

这时selection4已经是有8个div元素的集合了,在这个集合上我们使用text() 方法设置每个元素的文本内容:

  1. selection4.text(function(d){return d;});

你注意到text()方法的参数是一个函数!让我解释一下。

selection4是一个集合,内有8个div元素,我们经过之前的三斧,这每个元素都已经有对应 的数据了(d3负责管理其对应关系),比如,第一个DIV元素对应的是10,第二个DIV元素对应 的是15......

每当集合的方法被调用时,它都检查传入的参数,如果传入的参数是一个函数,d3就对集 合中的每个DOM元素执行一次这个函数,并传入这个DOM元素对应的数据。

我们接着使用classed()方法设置每个元素的CSS类为"bar":

  1. selection4.classed("bar",true)

最后使用width()方法使用每个元素对应的数据,设置其宽度。这个可以理解了吧?

参考资料:http://***/

d3.js:数据可视化利器之快速入门的更多相关文章

  1. d3.js:数据可视化利器之 交互行为:响应DOM事件

    selection.on:事件监听操作符 on()操作符可以添加或移除选择集中每个 DOM元素的事件监听函数: selection.on(type[,listener[,capture]]) 参数ty ...

  2. d3.js:数据可视化利器之 修改文档:DOM操作符

    style: CSS样式操作符 style()操作符用来设置或获取选择集中各DOM元素的CSS样式: selection.style(name[,value[,priority]]) style()操 ...

  3. [资料搜集狂]D3.js数据可视化开发库

    偶然看到一个强大的D3.js,存档之. D3.js 是近年来十分流行的一个数据可视化开发库. 采用BSD协议 源码:https://github.com/mbostock/d3 官网:http://d ...

  4. d3.js:数据可视化利器之 selection:选择集

    选择集/selection 选择集/selection是d3中的核心对象,用来封装一组从当前HTML文档中选中的元素: d3提供了两个方法用来创建selection对象: select(selecto ...

  5. 【python可视化系列】python数据可视化利器--pyecharts

    学可视化就跟学弹吉他一样,刚开始你会觉得自己弹出来的是噪音,也就有了在使用python可视化的时候,总说,我擦,为啥别人画的图那么溜: [python可视化系列]python数据可视化利器--pyec ...

  6. MOOC课程信息D3.js动态可视化

    版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/83153693 - 写在前面 好久没更新博客了,主要还是最近 ...

  7. 数据可视化利器pyechart和matplotlib比较

    python中用作数据可视化的工具有多种,其中matplotlib最为基础.故在工具选择上,图形美观之外,操作方便即上乘. 本文着重说明常见图表用基础版matplotlib和改良版pyecharts作 ...

  8. Python数据可视化利器Matplotlib,绘图入门篇,Pyplot介绍

    Pyplot matplotlib.pyplot是一个命令型函数集合,它可以让我们像使用MATLAB一样使用matplotlib.pyplot中的每一个函数都会对画布图像作出相应的改变,如创建画布.在 ...

  9. Node.js学习笔记3(快速入门)

           一.开始使用Node.js编程           1.hello world           好了,让我们开始实现第一个 Node.js 程序吧.打开你常用的文本编辑器,在其中输入 ...

随机推荐

  1. spark源码 hashpartitioner

    def nonNegativeMod(x: Int, mod: Int): Int = { val rawMod = x % mod rawMod + () mod ) def getPartitio ...

  2. Unix系统编程()进程内存布局

    每个进程所分配的内存由很多部分组成,通常称之为"段(segment)". 文本段包含了进程运行的程序机器语言指令.文本段具有只读属性,以防止进程通过错误指针意外修改自身指令. 因为 ...

  3. Linux下HTTP Server

    想在Linux下实现一个简单的web Server并不难.一个最简单的HTTP Server不过是一个高级的文件服务器,不断地接收客户端(浏览器)发送的HTTP请求,解析请求,处理请求,然后像客户端回 ...

  4. 归并排序的C++实现

    原创作品,转载请注明出处:点我 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列 ...

  5. 记一次线上Kafka消息堆积踩坑总结

    2018年05月31日 13:26:59 xiaoguozi0218 阅读数:2018更多 个人分类: 大数据   年后上线的系统,与其他业务系统的通信方式采用了第三代消息系统中间件Kafka.由于是 ...

  6. js学习笔记24----焦点事件

    事件: onfous : 元素获取焦点时触发事件 onblur : 元素失去焦点时触发事件 方法: obj.focus(); 可指定元素设置焦点 obj.blur(); 取消指定元素的焦点 obj.s ...

  7. 常用的easyui使用方法

    -------datagrid 1.获取某行的行号(row)tdg.datagrid('getRowIndex',rows)2.通过行号移除该行tdg.datagrid('deleteRow',ind ...

  8. 编译内核出现"mkimage" command not found - U-Boot images will not be built

    参考链接: http://spyker729.blogspot.com/2010/07/mkimage-command-not-found-u-boot-images.html 制作uImage的工具 ...

  9. 察看下列JSP内容

    察看下列JSP内容 <html><body> <% for (int i=0;i<3;i++){ %> out.print(i*2); <% } %&g ...

  10. 验证:record项元的多少影响修改速度。

    验证erlang官网提供的思想:record的修改是复制. -module (test_record). -record (record_5,{ aa1 = 0, aa2 = 0, aa3 = 0, ...