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

下面,就简单的结合自己研究的官方文档,对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. flex(兼容写法)

    CSS样式 flex:定义布局为盒模型 flex-v:盒模型垂直布局 flex-1:子元素占据剩余的空间 flex-align-center:子元素垂直居中 flex-pack-center:子元素水 ...

  2. 初接触BurpLoader工具

    初接触burp工具 菜鸟一枚,现在在接触一段时间测试,我在测试功能性的时候,想着网站被黑案例那么多,我是不是也应该弄弄安全性测试了,所以就有了下边的第一次接触BurpLoader工具来测试手机的app ...

  3. HTML教程-各窗口间相互操作(Frame Target)

    由Frames分出来的几个窗口的内容并不是静止不变的,往往一个窗口的内容随着另一个窗口的要求而不断变化,这就提高了Frames的利用价值.为了完成各窗口之间的相互操作,我们必须为每一个窗口起一个名字, ...

  4. SELECT控件操作的JS代码示例

    SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...

  5. 关于AE

    1.下方时间轴左边上角时间,按住ctrl点击,可切换时间与帧数 2.新建comp,ctrl+n 3.特效控制面板,F3 4.时间轴左边图层各个属性快捷键:移动,p:旋转,r:缩放,s:轴心,a:不透明 ...

  6. 黑马----面向方面编程AOP

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 JAVA反射-面向方面编程AOP 一.面向方面的需求 有如下模型: 需要统计客户登录时间.使用系统情况,或系统运行日记等信息时, ...

  7. linux驱动之LCD

    LCD程序步骤:1. 分配一个fb_info 2. 设置 3. 硬件相关的操作4. 注册 register_framebuffer 5.入口函数 6.出口函数 #include <linux/s ...

  8. jquery.easyui代码详解,和遇到的问题,提供大家在使用的时候少走弯路(一)

    初次使用jquery.easyui这个东东,虽然简单,但还是很费力的去研究了一下使用,在使用过程中遇到的问题,下面代码会详细的注释到 引用的文件jquery.min.js              j ...

  9. linux curl 下载jdk

    进入orecle官网,找到需要的安装包 需要cookie同意相关协议才能下载 curl -L "http://download.oracle.com/otn-pub/java/jdk/8u1 ...

  10. Android studio 菜单介绍 3.1.文件(File)

    文件(File) 3.1.1.New 1. Android Studio中的Project相当于Eclipse中的Workspace 3.1.5.Close Prject 关闭当前项目打开的窗口 2. ...