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]) 已映射的形式输出数组。

@待续

D3介绍的更多相关文章

  1. iOS-多线程介绍

    一.前言部分 最近在面试,重新温习了一遍多线程,希望加深一遍对于多线程的理解. 1.什么是进程? 1).要了解线程我们必须先了解进程,通俗来讲进程就是在系统中运行的一个应用程序. 2).每个线程之间是 ...

  2. d3.js读书笔记-2

    比例尺 比例尺基本内容 比例尺是一组把输入域映射为输出范围的函数.任意数据集中的值不可能恰好与图表中的像素尺度一一对应.比例尺就是把这些数据值映射为可视化图形中使用的新值的便捷手段.D3的比例尺就是那 ...

  3. D3树状图给指定特性的边特别显示颜色

    D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白 ...

  4. D3的基本设计思路

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

  5. D3树状图异步按需加载数据

    D3.js这个绘图工具,功能强大不必多说,完全一个Data Driven Document的绘图工具,用户可以按照自己的数据以及希望实现的图形,随心所欲的绘图. 图形绘制,D3默认采用的是异步加载,但 ...

  6. AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示

    前言: "宁肯像种子一样等待  也不愿像疲惫的陀螺  旋转得那样勉强" 这是前几天在查资料无意间看到的一位园友的签名,看完后又读了两遍,觉得很有味道.后来一寻根究底才知这是出资大诗 ...

  7. CPU工作状态的知识介绍

    转自:http://www.bbwxbbs.com/forum.php?mod=viewthread&tid=2552   近几年,个人计算机的运行速度有了质的飞跃,但是功耗却没能与时俱进,着 ...

  8. 【 D3.js 入门系列 --- 4 】 如何使用scale(比例)

    在上一节中使用了一个很重要的概念 — scale (这个不知道翻译成什么,暂且叫它比例).本节将重点介绍它的相关使用方法. 在介绍 scale 之前,先介绍两个经常和 scale 一起出现的函数,在上 ...

  9. WebSocket简单介绍

    Java后端WebSocket的Tomcat实现 一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSoc ...

随机推荐

  1. copymemory()数组赋值

    在各网站的文章里面,见复制数据的方法中,有move的,有system.copy的,而要实际应用中,这两种方法,并不是很完美,会遇到一些问题,比如copy在记录里面的复制时,编译都过不去,而CopyMe ...

  2. 在Android模拟器里安装apk

    [原文]http://Android.tgbus.com/android/tutorial/201104/349532.shtml 1.运行SDK Manager,选择模拟器,并运行模拟器. 2.将需 ...

  3. async异步操作和同步上下文

    第8章 哪个线程运行我的代码 看到社区里的朋友没有翻译完这本书,我接着对一下的章节进行翻译 像我之前说的,异步编程就是关于线程的.那就意味着我们需要理解在C#程序中哪个.NET线程什么时候运行我们的代 ...

  4. sql获取表的所有字段及属性

    select c.name as name,t.name as type ,convert(bit,c.IsNullable) as isNULL , from sysobjects where xt ...

  5. commons工具类

    转自:https://blog.csdn.net/leaderway/article/details/52387925 1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不 ...

  6. asp.net mvc项目创建WebApi简单例子

    1.创建默认路由的映射. namespace RedisDemo.App_Start { public class WebApiConfig { public static void Register ...

  7. NOI2007 社交网络

    题目链接:戳我 就是在floyd计算dis的时候,顺便把两点之间最短路的个数也计算了qwqwq \(sum[i][j]=\sum sum[i][k]*sum[k][j]\) 代码如下: #includ ...

  8. “全栈2019”Java第五十七章:多态与构造方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. 集合的addAll方法--list.addAll(null)会报错--java.lang.NullPointerException

    Exception in thread "main" java.lang.NullPointerException at java.util.ArrayList.addAll(Ar ...

  10. 用xpath来爬图

    # xpath语法可参考http://www.w3school.com.cn/xpath/xpath_syntax.asp# 本博客引用于https://zhuanlan.zhihu.com/some ...