zoukankan      html  css  js  c++  java
  • 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]) 已映射的形式输出数组。

    @待续

  • 相关阅读:
    HDU 5698 瞬间移动
    HDU 5695 Gym Class
    HDU 5694 BD String
    HDU 5692 Snacks
    HDU 5691 Sitting in Line
    胜利大逃亡
    BFS(广度优先搜索)
    计算直线的交点数
    Division
    Jesse's Code
  • 原文地址:https://www.cnblogs.com/zhangqunshi/p/6709675.html
Copyright © 2011-2022 走看看