当前位置:首页 > 日记 > 正文

d3.js入门教程之数据绑定详解

d3.js入门教程之数据绑定详解

前言

d3.js 是一款上手容易的js类库,专门用于绘制svg图形图表,其关键理念为data-join 意即数据绑定.搞清这个概念非常重要,它将以简洁优雅的形式体现数据驱动编程.

以下是Thinking with Joins的拙译 ,原作者Mike Bostock

假设你要用D3画一副散点图,因此需要生成一些 SVG circle 元素来直观地展现数据. 你会惊讶地发现D3没有提供原生的产生多个DOM元素的接口,

是的,只有一个 append 方法,用于产生单个DOM元素:

svg.append("circle")  .attr("cx", d.x)  .attr("cy", d.y)  .attr("r", 2.5); 

但那只是单个圆,而你想要更多: 最好data*中每个元素对应一个圆. 在你用蛮力写循环把圆画出来之前,让我们看看D3中的一个例子:

svg.selectAll("circle")  .data(data)  .enter().append("circle")  .attr("cx", function(d) { return d.x; })  .attr("cy", function(d) { return d.y; })  .attr("r", 2.5); 

*此处 data是一个 JSON 数组,其每个元素 由 x 和 y属性构成, 例如: [{"x": 1.0, "y":1.1},{"x": 2.0, "y":2.5}, …]. 另,SVG circle元素用cx,cy表达圆心坐标,r表达半径长度.

这份代码符合你的需求,即每个元素产生一个圆 , 通过x和y属性表达圆心的坐标.

selectAll("circle")是什么意思,为什么要在产生所有圆之前去选中根本不存在的元素呢?

原来事情是这样的:告诉D3你的目标,而不要告诉它具体怎么做. 在这个例子中,D3知道我们的意图是,要让选中的"circle"元素来响应数据的变化, selectAll即描述了这个目标;而无需一步步指挥D3产生多个圆.这个概念即data-join.

data-join的背后执行了以下步骤:

  • selectAll("circle") 返回了一个空的选择
  • 空的选择通过 data()方法将数据和DOM元素绑定,并产生三个虚拟的子集: enter, update and exit. enter()方法包含了待添加的数据及相应的DOM元素的占位符;update()包含了已与数据绑定的现有元素.剩下待移除的部分被包含在 exit ()方法中
  • 一开始选择的结果是空的,因此所有数据都是待添加,将全部出现在enter的结果中.
  • 无需循环,通过.enter().append("circle")将待添加的元素一次性加入到SVG容器.

为什么要这么麻烦呢? 为什么不直接提供原生接口? data-join的优雅之处在于抽象和解耦.上述代码在enter()里只是专心处理新增的元素,而update and exit分别专注于处理更新和待删除部分.这意味着你不用把所有DOM元素删了重绘,因此得以轻松应对实时变化的数据,甚至支持一些交互(如拖动)与渐变的效果!

这里是一个处理三种状态(增改删)的例子:

var circle = svg.selectAll("circle")  .data(data);  circle.enter().append("circle")  .attr("r", 2.5);  circle  .attr("cx", function(d) { return d.x; })  .attr("cy", function(d) { return d.y; });  circle.exit().remove(); 

如果我们重复运行代码,它会每次重新计算 data-join. 如果新的数据集比原来的少,多余元素会出现在 exit 中并被remove()删除.反之亦然,新增的数据出现在enter()中通过append()添加DOM元素.若新老数据集大小不变,则所有数据只是更新坐标.(译注:上文中介于enter和exit之间的代码,update()会被隐式调用)

以joins的方式思考同时让你的代码更直观: 处理这三种状态的代码无需条件(if)和循环(for)分支,只需简单描述让图形去响应数据的变化即可.如果给定的enter, update 或 exit 的选择结果为空,则会自动跳过相应的代码块,以降低性能开销.

Joins 支持在特定状态(增/删/改)下执行操作.例如,可以在enter而非update代码块中,指定静态的attributes(例如圆的半径,用 "r" attribute指定) . 仰赖于精确改动目标元素和最小化DOM变更,你已经极大地提升了浏览器渲染的表现! 类似地,你可以在特定状态下表现渐变等动画效果. 例如新增的圆可以从无到有渐变(半径从0到2.5):

circle.enter().append("circle")  .attr("r", 0)  .transition()  .attr("r", 2.5); 

待删除的圆也可以逐渐收缩直至消失:

circle.exit().transition()  .attr("r", 0)  .remove(); 

相信现在你已经学会用joins的方式思考了!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。

相关文章

浅谈javascript中的 “ && ” 和

浅谈javascript中的 “ && ” 和

浅谈,电脑软件,javascript,有时候,我们会在jQuery框架或者其他js插件中发现里面有很多 “ && ” 和 “ || ”,那么这两个标识到底是什么含义?怎么使用?我觉得还是有必要稍微深究一下。一、原理:&& 操作符特点:逻辑运算表达式中只要一个是false就…

word2013邮件合并功能的使用教程详

word2013邮件合并功能的使用教程详

合并,邮件,使用教程,步骤,功能,  邮件合并功能其实在实际运用中有很大的作用,比较常见的如运用邮件合并功能编辑信函、制作铭牌等等。灵活使用word自带的邮件合并功能,可以极大的提高我们的工作效率,减少重复劳动。那么下面就由小编给大家分…

Word2007怎样快速转换成PDF格式

Word2007怎样快速转换成PDF格式

转换成,快速,格式,电脑软件,PDF,  Word和PDF是常见的办公文档格式,这两种格式有时需要进行格式转换。那么下面就由小编为您分享下Word2007快速转换成PDF格式的技巧,希望能帮助您,有需要的朋友可以来看看哦。快速转换成PDF格式的步骤如下:  …

JavaScript数组迭代方法

JavaScript数组迭代方法

数组,方法,迭代,电脑软件,JavaScript,最近工作中经常涉及到数据的处理,数组尤其常见,经常需要对其进行遍历、转换操作,网上的文章零零散散,不得已自己又找出红宝书来翻出来看,顺便记一笔,便于以后查询。数组常用的迭代方法ECMAScript5为数组定义…

微信指纹支付如何取消

微信指纹支付如何取消

支付,取消,指纹,电脑软件,  当你在使用微信指纹支付时,偶尔会需要一些小问题,想要关闭指纹支付的方法也很简单,根据本文提供的图文教程即可轻松取消指纹支付,一起来看看吧!微信指纹支付如何取消其实关闭指纹支付的方法更加简单,和开启时程序一…

微信读书怎么免费看书?

微信读书怎么免费看书?

电脑软件,  微信读书怎么免费看书?不知道大家发现没有,微信读书app上面的书虽然都非常的有品位,推荐的书都是非常值得一读的好书,但是你们注意到标价没有?是不是有一丢丢高啊?那么在这里小编要告诉大家微信读书免费看书的方法,赶紧来mark~!微…

AngularJS2中一种button切换效果的

AngularJS2中一种button切换效果的

方法,效果,电脑软件,button,之前用三目表达式和ng-class实现了按钮切换效果,似乎达到了我的预期,但是我觉得还有改进空间,网上找了一些资料,大概还有以下几种实现方式:路由<button class="btn1" routerLink="component1" routerLinkActive=…

excel2007插入表单控件的教程excel

excel2007插入表单控件的教程excel

表单,控件,教程,电脑软件,strong,  Excel中的表单控件该如何插入呢?下面是小编带来的关于excel2007插入表单控件的教程,希望阅读过后对你有所启发!excel2007插入表单控件的教程插入表单步骤1:先看下效果,下面是两个调查表单,左边使用的是单选…

word2016文档中怎么切换插入改写模

word2016文档中怎么切换插入改写模

模式,文档,电脑软件,  很多用户在使用word时,输入空格后面的字就消失了,这是因为无意间切换了word的&ldquo;改写/插入&rdquo;模式。以下是小编为您带来的关于word2016文档切换插入改写模式,希望对您有所帮助。word2016文档切换插入改写模式…

浅谈jQuery中事情的动态绑定

浅谈jQuery中事情的动态绑定

动态绑定,浅谈,事情,电脑软件,jQuery,在jQuery的开发过程中,我们往往需要处理各种事件,例如click(),hover()等。在jQuery的API中,我们可以使用不同的方法来将这些事件绑定到特定的元素中。今天这篇文章中,我们将要介绍如何使用bind(),on(),live()…

ps软件怎样用钢笔来抠图

ps软件怎样用钢笔来抠图

抠图,方法,电脑软件,ps,  在ps软件中抠图的方法其实有很多,我们还可以使用钢笔来进行抠图。那么大家知道ps软件怎样用钢笔来抠图吗?下面是小编整理的ps软件怎样用钢笔来抠图的方法,希望能帮到大家!ps软件用钢笔来抠图的方法1、运行PS软件(…

WPS演示2013中如何设置自定义放映

WPS演示2013中如何设置自定义放映

自定义,设置,演示,如何设置,电脑软件,  打开一份幻灯片,有好多页,但是我们也没必要非要将不需要放映的删去,我们可以利用自定义放映的方法指定放映幻灯片中特定的几页。以下是小编为您带来的关于WPS演示2013中设置自定义放映,希望对您有所帮…