学习一项新技术,首先要搞清楚它的基本设计思路,有了这个宏观的技术架构,使用该技术起来,就会得心应手了。否则,就会不知道如何下手,即使看到人家的例子程序,可能也不知其所以然。

下面,就简单的结合自己研究的官方文档,对D3的使用,给其基本设计思路,做一个简单的描述:

在html文件中加载完官方的js插件d3.v3.min.js后:

1.  设计画布(这里主要基于SVG介绍,当然,画布其实还有Canvas)。

a. 主要包括SVG的大小,含有width,以及height。

b. 通过d3全局对象,构建svg对象。

2. 创建视图(D3支持的视图很多)

 [[bundle|捆绑布局]] - 对边使用Holten 层次捆绑算法。
[[chord|弦布局]] - 从关系矩阵生成一个弦图。
[[cluster|簇布局]] - 将实体聚集成树状图。
[[force|力布局]] - 模拟物理力排放相连节点的位置。
[[hierarchy|层次布局]] - 这是个抽象布局,可派生一个定制的层次布局。
[[histogram|直方图布局]] - 使用量化的箱计算数据的分布。
[[pack|包布局]] - 用递归的圆形包装生成一个层次布局。
[[partition|分区布局]] - 递归地将节点树分割为旭日状或者冰柱状。
[[pie|饼布局]] - 计算饼图或圆环图中弧的开始和结束角度。
[[stack|堆叠布局]] - 计算堆叠图或者面积图的基线。
[[tree|树布局]] - 整齐地排列树节点。注意簇布局不是整齐的。
[[treemap|矩形树布局]] - 使用空间递归分区算法展示树的节点。

例如:

var tree = d3.layout.tree();

3. 数据绑定

其实,这一步做的事情,就是一个视图与数据的结合,视图将数据转化为该视图内定的数据结构,重点是添加了一些D3功能相关的辅助参数或者变量。 例如上例中的树视图,数据绑定后过程如下:

 var nodes = tree.nodes(root).reverse(),
var links = tree.links(nodes);

这个绑定,也可以说是数据转化,之后,nodes对象中不仅含有root这个原始数据(用户提供的输入数据),还含有D3系统需要的辅助参数,比如parent,depth等。

4.  视图数据结合

这一步,其实最能体现D3的设计思想,这一步涵盖的内容最为丰富,但是不多讲,重点介绍D3的特色操作enter,update,exit。

a. 获取新的选择器(SVG灌入绑定数据后的新对象)

例如:

var node = svg.selectAll("g.node").data(nodes, function(d) { return d.id || (d.id = ++i); });

     b. enter/update/exit

        这三个概念是什么含义呢?

如果数组为 [3, 6, 9, 12, 15],将此数组绑定到三个 p 元素的选择集上。可以想象,会有两个数据没有元素与之对应,这时候 D3 会建立两个空的元素与数据对应,这一部分就称为 Enter。而有元素与数据对应的部分称为 Update。如果数组为 [3],则会有两个元素没有数据绑定,那么没有数据绑定的部分被称为 Exit。

例如下图:

对于图形存在交互操作的情景,enter,update,以及exit都会用得到,例如我上一篇博客D3树状图异步按需加载数据里面的树状图,点击节点会有展开和收缩的效果,这个时候三者都会参与实际的逻辑处理。

Update 和 Enter 的使用

当对应的元素不足时 ( 绑定数据数量 > 对应元素 ),需要添加元素(append)。

现在 body 中有三个 p 元素,要绑定一个长度大于 3 的数组到 p 的选择集上,然后分别处理 update 和 enter 两部分。

 var dataset = [  ,  ,  ,  ,  ];

 //选择body中的p元素
var p = d3.select("body").selectAll("p"); //获取update部分
var update = p.data(dataset); //获取enter部分
var enter = update.enter(); //update部分的处理:更新属性值
update.text(function(d){
return "update " + d;
}); //enter部分的处理:添加元素后赋予属性值
enter.append("p")
.text(function(d){
return "enter " + d;
});
  • update 部分的处理办法一般是:更新属性值
  • enter 部分的处理办法一般是:添加元素后,赋予属性值

Update 和 Exit 的使用

当对应的元素过多时 ( 绑定数据数量 < 对应元素 ),需要删掉多余的元素。

现在 body 中有三个 p 元素,要绑定一个长度小于 3 的数组到 p 的选择集上,然后分别处理 update 和 exit 两部分。

 var dataset = [  ];

 //选择body中的p元素
var p = d3.select("body").selectAll("p"); //获取update部分
var update = p.data(dataset); //获取exit部分
var exit = update.exit(); //update部分的处理:更新属性值
update.text(function(d){
return "update " + d;
}); //exit部分的处理:修改p元素的属性
exit.text(function(d){
return "exit";
}); //exit部分的处理通常是删除元素
// exit.remove();
  • exit 部分的处理办法一般是:删除元素(remove)

到此, 入门D3,了解这个基本的框架,再去细读API文档或者教程,相对会容易些!

最后,附带一个简单的例子,绘制环状图(显示资源占用比例的场景,还是很有使用价值的):

 <html>
<head>
<meta charset="utf-8">
<title>环装图</title>
</head> <style> </style>
<body>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script> var width = ;
var height = ;
var dataset = [ , , , , , , , ]; var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height); var pie = d3.layout.pie(); var piedata = pie(dataset); var outerRadius = ; //外半径
var innerRadius = ; //内半径,为100则中间没有空白 var arc = d3.svg.arc() //弧生成器
.innerRadius(innerRadius) //设置内半径
.outerRadius(outerRadius); //设置外半径 var color = d3.scale.category20c(); var arcs = svg.selectAll("g")
.data(piedata)
.enter()
.append("g")
.attr("transform","translate("+ (width/) +","+ (width/) +")"); arcs.append("path")
.attr("fill",function(d,i){
return color(i);
})
.attr("d",function(d){
return arc(d);
}); arcs.append("text")
.attr("transform",function(d){
return "translate(" + arc.centroid(d) + ")";
})
.attr("text-anchor","middle")
.text(function(d){
return d.data;
});
</script> </body>
</html>

D3的基本设计思路的更多相关文章

  1. 初识 D3.js :打造专属可视化

    一.前言 随着现在自定义可视化的需求日益增长,Highcharts.echarts等高度封装的可视化框架已经无法满足用户各种强定制性的可视化需求了,这个时候D3的无限定制的能力就脱颖而出. 如果想要通 ...

  2. python学习之路-day6-面向对象

    一.面向对象学习 特性 class类 一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性.共同的方法. 面向过程编程和面向对象编程: 面向过程编程:使用一系列的指 ...

  3. 【python之旅】python的面向对象

    一.面向过程 VS 面向对象 1.编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,实现一个任务的 ...

  4. Python全栈开发-Day6-面向对象编程

    本节内容: 面向过程VS面向对象 面向对象编程介绍 类的语法 构造函数.析构函数 私有方法.私有属性 面向对象的特性:封装.继承.多态 1.面向过程 VS 面向对象 编程范式 编程是程序员用特定的语法 ...

  5. D06——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D06 20180821内容纲要: 面向对象初级学习 1 面向对象 2 类 (1)封装 (2)继承 (3)多态 3 小结 4 练习:选课系统 5 课外拓展:答题系 ...

  6. 如何在高并发分布式系统中生成全局唯一Id

    月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也讨论了这个主题,我受益匪浅啊…… 博文示例: 1.     ...

  7. Python之路,Day7 - Python基础7 面向对象

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...

  8. Python之路第一课Day6--随堂笔记(面向对象 )

    本节内容: 1. 面向对象编程介绍 2. 为什么要用面向对象进行开发? 3. 面向对象的特性:封装.继承.多态 4. 类.方法   一.面向过程 VS 面向对象  1. 编程范式 编程是 程序 员 用 ...

  9. 一鼓作气 博客--第七篇 note7

    面向对象相关知识简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...

随机推荐

  1. C语言程序设计第十一次作业

    同学们,一晃一个学期就过去了,第一节课时,我曾做过一个调查,没有一个同学在中学阶段接触过程序设计,也就是说,那时,大家都是零基础,或许只是听说过"C语言"这个词,但其他便一无所知了 ...

  2. 【Java讨论】引用类型赋值为null对加速垃圾回收的作用(转载)

    :有一些人认为等于null可以帮助垃圾回收机制早点发现并标识对象是垃圾.其他人则认为这没有任何帮助.是否赋值为null的问题首先在方法的内部被人提起.现在,为了更好的阐述提出的问题,我们来撰写一个Wi ...

  3. JMeter 服务器性能监测插件介绍

    简介 压力测试过程中,能够随时对负载服务器的健康状况的把控是相当重要的,有了这些数据,我们才能准确分析出服务器负载瓶颈.当你面对的是一个集群的时候,如果能了解到负载是否被正确分发,是不是一件很棒的事情 ...

  4. job console部署

    1. iis配置 1.1 应用程序池配置成经典模式 1.2 增加mini类型.svc,application/octet-stream 1.3 增加脚本映射,*.svc,%windir%\Micros ...

  5. HDU 5884 (贪心)

    problem sort 题目大意 有n个数组,每个数组有a[i]个元素,每次可以将至多k个数组合并为一个数组,所花费代价为这些数组的元素和.给定代价上限,求将所有数组合并为1个数组的最小k. 解题分 ...

  6. Nginx配置指定媒体类型文件强制下载

    由于业务需要,在点击显示链接(如www.xxx.com/2015-01-15/xxx.png)显示媒体资源(如图片.视频.音频.文档),而在点击下载链接(如www.xxx.com/2015-01-15 ...

  7. c++ 顺序容器学习

    所谓容器,就是一个装东西的盒子,在c++中,我们把装的东西叫做“元素” 而顺序容器,就是说这些东西是有顺序的,你装进去是什么顺序,它们在里面就是什么顺序. c++中的顺序容器一共有这么几种: vect ...

  8. CSS外边距margin上下元素重叠

    CSS外边距margin上下元素重叠 转载:http://www.gaoyouyou.com/view/77.htm 两个或多个块级盒子的垂直相邻边界会重合.结果的边界宽度是相邻边界宽度中最大的值.如 ...

  9. 行列式计算(C#)

    最近几天学习高等代数老师说要写个程序算行列式的结果,闲来无事就简单写了一下. 不多说了,上代码 using System; using System.Collections.Generic; usin ...

  10. CSS counter-reset 属性

    一.实例 对部分和子部分进行编号(比如 "Section 1"."1.1"."1.2")的方法: eg: css部分: ol { list- ...