D3介绍

D3介绍

D3是用来做web页面可视化的组件,其官方网址为http://d3js.org

安装

D3类库的文件只有一个d3.js。下载后直接在html的<script>标签中引用此js就可以了。
最好安装一个web服务器,例如apache HTTP server, nginx等等。

绘制SVG

一般D3实在SVG上进行作图的。虽然可以在Canvas上作图,但D3提供了大量SVG图形的生成器,也就是说D3更面向SVG开发。例如:

var svg = d3.select("body").append("svg").attr("width", 200).attr("height", 200);
svg.append("circle").attr("cx", "50px").attr("cy", "50px").attr("r", "50px").attr("fill", "green");

选择集(selection)

d3.select和d3.selectAll返回的对象被称为选择集
选择集的产生如下:

var p = d3.selectAll("p");

上面是选择了所有的p标签。如果只想选择一个可以使用d3.select()方法。

选择集产生后就可以调用选择集的一些方法,其方法有如下功能:

查看状态函数

  • empty() 判断选择集是否为空
  • node() 返回第一个非空元素, 如果选择集为空,则返回null.
  • size() 返回选择集元素个数。

获取或设定值

  • attr(name[,value]) 设置或返回选择集的属性, name参数为属性名称,value为属性值。如果省略value,则返回当前值;如果给定了value,则将name的值设置为value。
  • classed(name[,value]) 设定或获取选择集的CSS类。name是类名,value是一个布尔值。布尔值表示该类是否开启。name中可以包含多个类(使用逗号分隔)。
  • style(name[, value[, priority]]) 设定或获取选择集的样式。name为样式名,value为样式值。
  • property(name[,value]) 设定或获取选择集的属性。有部分属性不能使用attr()函数,例如输入框的value属性,需要使用property()函数。
  • text([value]) 获取或设定选择集中的文本内容。
  • html([value]) 获取或设定选择集中的内部HTML内容。类似于DOM的innerHTML,包括内部的标签。

添加,插入或者删除

  • append(name) 在选择集末尾添加一个元素。例如: body.append("p").text("hello")
  • insert(name[, before]) 在选择集指定元素之前插入一个元素。before是CSS选择器名称。例如:body.insert("p", "#id").text("hello")
  • remove() 删除选择集中的元素。

绑定数据

  • datum([value]) 选择集中每一个元素都绑定相同数据。
  • data([values[, key]]) 选择集中的每一个元素分别绑定values中的每一项。key是一个键函数,用于指定绑定数组时的对应规则。

绑定数据实际上在每个元素里面增加一个__data__元素,其内容为你给定的值。
例子:

var p = d3.select("body").selectAll("p");
p.datum(7);
console.log(p);

注意:在被绑定数据的元素后面添加新元素后,新元素还会继承绑定数据。

var dataset = [1, 2, 3];
var p = d3.select("body").selectAll("p");
var update = p.data(dataset)
console.log(update)

绑定顺序

当使用data进行绑定时,默认采用升序,第0元素绑定数组中第0项,第1元素绑定数组中第1项,依次类推。如果想使用不同的顺序绑定,那么就会用到data()第二个参数键函数。

persons = [{id: 2, name: "kris"}, {id: 1, name: "zhang"}]

p.data(persons, function(d) { return d.id; })
    .text(function(d) {
        return d.id + ": " + d.name;
    });

选择集处理

当数组长度和元素数量不一致时,就有enter部分,exit部分,update部分。

var dataset = [1, 2, 3];
var p = d3.select("body").selectAll("p");
var update = p.data(dataset);

// update部分直接修改
update.text( function(d) { return d;} );

var enter = update.enter()
// enter部分为增加的数据,添加对应的元素
enter.append("p").text(
        function(d) { return d; };
    );

// exit部分就是删除元素
var exit = update.exit()
exit.remove();

过滤器

有时候需要根据被绑定的数据对选择集中的元素进行过滤,使用filter()函数。

var p = d3.select("body").selectAll("p");
p.filter(function(d, i) {
    if (d > 10) {
        return true;
    }
    return false;
});

选择集排序

根据被绑定数据对选择集中的元素进行排序,使用sort()函数。

var p = d3.select("body").selectAll("p");
p.sort(function(a, b) {
    return a - b;
});

选择集遍历

对选择集中每个元素分别处理,使用each()函数。

var p = d3.select("body").selectAll("p");
p.data(dataset)
    .each(function(d, i) {
        d.name = "kris";
    })
    .text(function(d, i) {
        return d.id + ": " + d.name;
    });

call函数

call()函数用来把选择集作为参数传递给某个函数。拖拽、缩放元素等操作会用到call()。

d3.selectAll("div").call(myFun);

function myFun(selection) {
    selection.attr("name", "kris");
}

数组处理

D3提供了很多针对数组的操作函数。

排序

  • d3.ascending(a, b) 递增函数
  • d3.descending(a, b) 递减函数

求值

  • d3.min(array[, accessor]) 返回最小值。accessor是一个函数,指定之后数组各项会先调用accessor。
  • d3.max(array[, accessor]) 返回最大值
  • d3.extent(array[, accessor]) 返回一个列表,其中包括最小和最大值
  • d3.sum(array[, accessor]) 返回数组总和。如果数组为空,则返回0.
  • d3.mean(array[, accessor]) 返回数组平均值,如果数组为空,则返回undefined
  • d3.median(array[a, accessor]) 返回数组中间值,如果数组为空,则返回undefined
  • d3.quantile(numbers, p) 求取p分位点的值。p的范围为[0, 1]。数组需要先递增排序。
  • d3.variance(array[, accessor]) 求方差
  • d3.deviation(array[, accessor]) 求标准差
  • d3.bisectLeft() 获取一个数组项左边的位置。
  • d3.bisect() 获取一个数组项右边的位置。
  • d3.bisectRight() 和bisect()一样。

操作数组

  • d3.shuffle(array[, lo[, hi]]) 随机排列数组内容
  • d3.merge(arrays) 合并两个数组(参数是一个大数组,包含要合并两个数组)
  • d3.pairs(array) 返回一个数组,其包含两个相邻的数组成的数组。
  • d3.range([start, ] stop [, step]) 返回等差数列。start默认值为0,step默认值为1.
  • d3.permute(array, indexes) 根据指定的索引号数组返回排列后的数组。
  • d3.zip(array, ...) 制作数组的数组。
  • d3.transpose(matrix) 求转置矩阵。

映射(Map)

  • d3.map([object][, key]) 建立一个映射。第一个参数为数组,第二个参数指定映射的key。
  • map.has(key) 判断是否key存在于map中
  • map.get(key) 获取key对应的value,不存在返回undefined
  • map.set(key, value) 设定key对应的value
  • map.remove(key) 删除key和value
  • map.keys() 返回所有的key(数组)
  • map.values() 返回所有value(数组)
  • map.entries() 返回key和value的数组
  • map.forEach(function) 分别对map中的每一项调用function函数。function函数有2个参数:key, value。
  • map.empty() 是否为空
  • map.size() 返回元素个数

集合(Set)

  • d3.set([array]) 建立一个集合。如果数组给定,则使用数组中的值,但不会使用重复元素。
  • set.has(value) 是否存在value
  • set.add(value) 增加value
  • set.remove(value) 删除value
  • set.values() 返回所有内容
  • set.forEach(function) 对每一个元素调用function。function参数为value。
  • set.empty() 是否为空
  • set.size() 返回大小

嵌套结构(Nest)

嵌套结构用来对数组中的对象进行分类,一层套一层,让索引更加方便。就是把一组元素以树状结构组织起来。

  • d3.nest() 创建一个空的nest对象。
  • nest.key(function) 指定nest的key
  • nest.entries(array) 指定数组array将放入nest中作为数据,同时把上一步的key()函数指定键作为key。
  • nest.sortKeys(comparator) 对nest的数据进行排序,在key()方法后调用. 参数为d3.descending或ascending
  • nest.sortValues(comparator) 根据值进行排序
  • nest.rollup(function) 对每一组叶子节点调用指定的函数function。参数为values,当前叶子节点的数组。
  • nest.map(array[, mapType]) 已映射的形式输出数组。

@待续

原文地址:https://www.cnblogs.com/zhangqunshi/p/6709675.html