d3.nest 详解
来源:互联网 发布:招商银行黄金分析软件 编辑:程序博客网 时间:2024/06/05 02:37
d3.nest可以分组数据
在进行数据分析时Grouping data是一个很重要的能力 .通常,我们需要将数据按照某个类别进行打散,并查找和统计每个组的具体细节。
D3 包括强大的d3.nest 功能,可以通过极小量的代码构造分组。
Nest 基础
用户来决定这个嵌套多少层。
跟很多GROUP_BY概念有点不同,其中只允许有嵌套一个级别。
例如,我们有如下的 CSV 格式文件 “expenses”:
name,amount,datejim,34.0,11/12/2015carl,120.11,11/12/2015jim,45.0,12/01/2015stacy,12.00,01/04/2016stacy,34.10,01/04/2016stacy,44.80,01/05/2016
转换为对象数组:
var expenses = [{"name":"jim","amount":34,"date":"11/12/2015"}, {"name":"carl","amount":120.11,"date":"11/12/2015"}, {"name":"jim","amount":45,"date":"12/01/2015"}, {"name":"stacy","amount":12.00,"date":"01/04/2016"}, {"name":"stacy","amount":34.10,"date":"01/04/2016"}, {"name":"stacy","amount":44.80,"date":"01/05/2016"}];
然后,由我们决定以什么样的方式将这些数据切片
我们首先以Name
var expensesByName = d3.nest() .key(function(d) { return d.name; }) .entries(expenses);
用的D3.js
结果为:
expensesByName = [ {"key":"jim","values":[ {"name":"jim","amount":34,"date":"11/12/2015"}, {"name":"jim","amount":45,"date":"12/01/2015"} ]}, {"key":"carl","values":[ {"name":"carl","amount":120.11,"date":"11/12/2015"} ]}, {"key":"stacy","values":[ {"name":"stacy","amount":12.00,"date":"01/04/2016"}, {"name":"stacy","amount":34.10,"date":"01/04/2016"}, {"name":"stacy","amount":44.80,"date":"01/05/2016"} ]}];
expensesByName 为一个对象数组. 用key function来组成value,每个对象都有一个key属性和value属性
这些entries的values属性是一个数组,是所有的原始数据对象。
概述Groups
嵌套的结构非常有利于可视化数据,特别是分析应用。
d3.rollup , 提供一个功能来获取每个组的values,并产生新的数值。这使得group功能非常灵活。
如下面的例子获取每个name的总数:
var expensesCount = d3.nest() .key(function(d) { return d.name; }) .rollup(function(v) { return v.length; }) .entries(expenses);console.log(JSON.stringify(expensesCount));
=> [{"key":"jim","values":2},{"key":"carl","values":1},{"key":"stacy","values":3}]
用来的values值由rollup函数产生的值所所代替。 而name不变。
另外一个例子获取每个人的平均金额:
var expensesAvgAmount = d3.nest() .key(function(d) { return d.name; }) .rollup(function(v) { return d3.mean(v, function(d) { return d.amount; }); }) .entries(expenses);console.log(JSON.stringify(expensesAvgAmount));
=> [{"key":"jim","values":39.5},{"key":"carl","values":120.11},{"key":"stacy","values":30.3}]
很棒吧?rollup中还可以使用多个操作:
var expenseMetrics = d3.nest() .key(function(d) { return d.name; }) .rollup(function(v) { return { count: v.length, total: d3.sum(v, function(d) { return d.amount; }), avg: d3.mean(v, function(d) { return d.amount; }) }; }) .entries(expenses);console.log(JSON.stringify(expenseMetrics));
=> [{"key":"jim","values":{"count":2,"total":79,"avg":39.5}}, {"key":"carl","values":{"count":1,"total":120.11,"avg":120.11}}, {"key":"stacy","values":{"count":3,"total":90.9,"avg":30.3}}]
输出Map
数组可以输出为Map的数据结果,或者使用forEach来处理迭代和合计任务。d3.nest可以返回一个对象(或者map),如下:
var expensesTotal = d3.nest() .key(function(d) { return d.name; }) .rollup(function(v) { return d3.sum(v, function(d) { return d.amount; }); }) .map(expenses);console.log(JSON.stringify(expensesTotal));
=> {"jim":79,"carl":120.11,"stacy":90.9}
多级嵌套
nest还可以多级嵌套
可以进一步key操作,如下,每个人的花费总计,以及日期:
var expensesTotalByDay = d3.nest() .key(function(d) { return d.name; }) .key(function(d) { return d.date; }) .rollup(function(v) { return d3.sum(v, function(d) { return d.amount; }); }) .map(expenses);console.log(JSON.stringify(expensesTotalByDay));
=> {"jim":{"11/12/2015":34,"12/01/2015":45}, "carl":{"11/12/2015":120.11}, "stacy":{"01/04/2016":46.1,"01/05/2016":44.8}}
rollup是应用在子分组中。
nest.key的先后顺序决定了分组的方式. 如果交换name和date:
var expensesTotalByDay = d3.nest() .key(function(d) { return d.date; }) .key(function(d) { return d.name; }) .rollup(function(v) { return d3.sum(v, function(d) { return d.amount; }); }) .map(expenses);console.log(JSON.stringify(expensesTotalByDay));
=> {"11/12/2015":{"jim":34,"carl":120.11}, "12/01/2015":{"jim":45}, "01/04/2016":{"stacy":46.1}, "01/05/2016":{"stacy":44.8}}
衍生 Key Values
我们可以自己指定keyvalue,例如,我们想知道每年的总数,我们可以仅仅操作date,来获取年号:
var expensesByYear = d3.nest() .key(function(d) { return d.date.split("/")[2]; }) .rollup(function(v) { return d3.sum(v, function(d) { return d.amount; }); }) .map(expenses);console.log(JSON.stringify(expensesByYear));
=> {"2015":199.11,"2016":90.9}
- d3.nest 详解
- d3.js d3.scale.ordinal() --详解 rangeBands
- d3
- D3
- d3
- D3
- D3
- D3
- D3
- D3
- D3.js 动态数据刷新视图详解
- D3.js 中 Box Plots详解
- D3.js 中Bubble Chart详解
- D3.js中Bullet Charts详解
- D3.js中的Calendar View详解
- D3.js 中的 Non-Contiguous Cartogram详解
- D3.js中的Chord Diagram详解
- D3.js中的Cluster Dendrogram详解
- Django的基本命令
- 创业准备
- VS2013环境下配置gsl1.8及常见问题
- lua下打印有多层嵌套的table结构
- 阅读程序(6)
- d3.nest 详解
- art 是怎么把 dalvik 指令编译成 native code 第二篇(走马观花)
- test
- Ubuntu下迁移MySQL数据库文件目录
- u-boot Makefile完全解读
- 第十六周项目2-文件保存学生名单
- STM32中断管理
- tomcat start不了
- 路径问题