http://alignedleft.com/tutorials/d3/
D3简介
D3全称:Data-Driven Documents
D3是一个很神奇的基于Javascript的在网页上实现数据可视化的工具。作者是原可视化工具Protovis开发小组的成员Mike Bostock,现Protovis已经不再更新,Mike Bostock将主要精力转向以Protovis为基础的D3,更好的支持大数据处理和动态交互。已发布到V2版本,作者也提供V3版本,但尚未正式发布。
掌握D3的基础:
1、熟悉 HTML,DOM,CSS;
2、有那么一点点的编程经历;
3、知道什么是 jQuery,至少要了解Javascript;
4、愿意去学习CSV、SVG、JSON、正则表达式等知识点;
5、为了更好的理解,可以补充一些XML、XHML、HTML5、AJAX等等,清楚其中的区别;
6、你需要有热情,并愿意做出优秀的、交互式可视化图形。
开发工具:不是必需的!
基于D3的开发不需要特别的开发工具,用系统自带的记事本就可以(不推荐使用写字板),如果为了可视方便,可以使用Notepad++或者Editplus,推荐WebStorm。
调试:Chrome 和 Firefox 都自带Javascript调试功能。
为了本地开发方便,可以装个本地server。
简单的开始
准备工作
参考项目目录:
/
d3/
d3.v2.js
d3.v2.min.js
index.html
其中d3.v2.min.js是压缩版,更小,推荐网站发布时使用。
简单的布局:
D3 Test
上例只是内嵌形式,也可以将D3代码写在单独的 .js 文件中。
添加元素
我们在START区域内写入:
d3.select("body").append("p").text("New paragraph!");
解析:
d3代表D3对象;
d3的select()方法通过使用CSS选择器的语法来选择DOM元素(如body),并且选择的是第一个匹配的元素,使用 selectAll() 可以返回所有匹配元素。
append()方法是在所选择元素内的末尾加上元素(如p),也即追加;
text()方法写入元素内容。
D3语法
D3的语法被称为
链语法( chain syntax ),通过添加链节点可以在一行代码内实现多个操作。如上例可以写作:
d3.select("body")
.append("p")
.text("New paragraph!");
结果是一样的。那么为了读写方便,推荐使用这种方式,除非需要压缩代码。
由于一个方法的输出类型往往是后一个方法的输入类型,因此链中的方法是
按顺序排列的。
数据绑定及其使用
数据绑定:
数据绑定是为了给选择的元素附加一个数值,以便后面使用,根据这个数值的大小可以自由控制元素的呈现形式。
START:
var dataset = [ 5, 10, 15, 20, 25 ];
d3.select("body").selectAll("p")
.data(dataset)
.enter()
.append("p")
.text("New paragraph!");
绑定方法:selection
.data() data()参数是绑定的数据。
有时候数据数量可能多于所选元素数量,这时候就需要使用
.enter()方法来检查数量是否相等,如果不等,enter()会创建一个新的
元素占位符(placeholder),然后把占位符的引用提交给链的下一环节。
.append()方法获取enter()方法创建的元素占位符后,将新的p元素添加到DOM。
上述数据可以在Chrome Console输入console.log(d3.selectAll("p"))看到。
数据使用:
把上述代码最后一行改为:
.text(function(d) { return d; });
上句匿名函数 function(d) 的参数d就是绑定的数值。具体的返回值,可以在匿名函数内写控制代码。
Drawing divs
这一节通过设置div来生成bar,首先设置div的class:
div.bar {
display: inline-block;
width: 20px;
height: 75px; /* We'll override this later */
margin-right: 2px; //设定bar的间隔
background-color: teal;
}
数据绑定:
var dataset = [ 5, 10, 15, 20, 25 ];
d3.select("body").selectAll("div")
.data(dataset)
.enter()
.append("div")
.attr("class", "bar");
.style("height", function(d) {
return 5*d + "px";
});
返回5个不同高度的bar。
随机数据的生成:
var dataset = []; //Initialize empty array
for (var i = 0; i < 25; i++) { //Loop 25 times
var newNumber = Math.round(Math.random() * 30); // 0-30
dataset = dataset.concat(newNumber); //添加数组元素
}
Javascript的String和Array都有concat方法,分别连接字符串和添加数组元素。
Drawing SVGs
使用append() 和attr()来画SVG:
START:
//Width and height
var w = 500;
var h = 50;
//Data
var dataset = [ 5, 10, 15, 20, 25 ];
//Create SVG element
var svg = d3.select("body")
.append("svg")
.attr("width", w)
.attr("height", h);
var circles = svg.selectAll("circle")
.data(dataset)
.enter()
.append("circle");
circles.attr("cx", function(d, i) {
return (i * 50) + 25;
})
.attr("cy", h/2)
.attr("r", function(d) {
return d;
})
.attr("fill", "yellow")
.attr("stroke", "orange")
.attr("stroke-width", function(d) {
return d/2;
});
数据类型
D3的输入数据非常灵活。
数组Array:使用[ ]包括,逗号隔开,for()循环常用。
对象Objects:使用{ }包括,不同值对用逗号隔开。
var fruit = {
kind: "grape",
color: "red",
quantity: 12,
tasty: true
};
引用单个值时使用点标记( dot notation),例如:fruit.kind
数组+对象(Arrays + Objects):可以灵活使用,互相包含,根据需求设定。但记住数组使用[ ],对象使用{ }。
JSON:与Objects的区别是属性名称都用{ }包括起来:
var jsonFruit = {
"kind": "grape",
"color": "red",
"quantity": 12,
"tasty": true
};
GeoJSON:用于存储地理信息数据,是JSON对象的格式化。GeoJSON对象也是JSON对象,所有的JSON对象都是Javascript对象。
GeoJSON 在地理空间上存储点坐标(经纬度坐标系),也可以在形状或其它空间特性上存储。经度在前,纬度在后。具体示例见JSON之GeoJSON。