Cos*_*Cos 1 json aggregate d3.js c3
假设我有以下格式的数据集:
var smallTestData = [
{"YEAR": "2009", "MONTH": "1", "CUSTOMER": "Customer1", "REVENUE": "1938.49488391425"},
{"YEAR": "2009", "MONTH": "1", "CUSTOMER": "Customer2", "REVENUE": "75.9142774343491"},
{"YEAR": "2009", "MONTH": "1", "CUSTOMER": "Customer2", "REVENUE": "99.3456067931875"} ...];
Run Code Online (Sandbox Code Playgroud)
现在,如果我想绘制一个D3或C3图表来显示每个客户每年和每月的累计收入,我想我最终会得到这样的结果:
[{"yearMonth":"2009 1","revenueCustomer1":158989,"revenueCustomer2":68181},
{"yearMonth":"2009 2","revenueCustomer1":171217,"revenueCustomer2":204975},
{"yearMonth":"2009 3","revenueCustomer1":38477,"revenueCustomer2":46605} ...];
Run Code Online (Sandbox Code Playgroud)
当然,这看起来并不优雅,但那没什么.最糟糕的部分是基于多维度(例如,年,月,客户)的度量(例如收入)的聚合,这对于JSON数据来说是一件痛苦的事情.
我已经尝试编写自己的聚合函数来解决这个问题,但除了手动将值一起添加之外,找不到任何令人满意的解决方案.谁能引导我朝着正确的方向前进?您将如何汇总数据以适应我所描述的图表类型?有没有现成的解决方案?
既然我们正在讨论这个话题,您将如何基于主键加入两个或更多数据集?
谢谢!
这似乎是破灭的最佳时机d3.nest()
.请访问https://github.com/mbostock/d3/wiki/Arrays#-nest了解更多信息.
对于您的数据以及您要执行的操作,您可以执行以下操作:
var nestedData = d3.nest().key(function(d) { return d.YEAR + " " + d.MONTH; })
.key(function(d) { return d.CUSTOMER; })
.rollup(function(leaves) {
return d3.sum(leaves, function(d) {
return +d.REVENUE;
});
})
.entries(smallTestData);
Run Code Online (Sandbox Code Playgroud)
这将返回一个类似于的对象:
[
{
key: "2009 1",
values: [
{
key: "Customer1"
values: 1938.49488391425
},
{
key: "Customer2"
values: 175.2598842275366
}
},
{ ... }
]
Run Code Online (Sandbox Code Playgroud)
方法d3.nest
是key
函数定义您希望聚合的对象属性,该rollup
函数用于汇总与key
函数匹配的所有数据.每个key
函数都将创建一个新的嵌套深度.如果您没有该rollup
函数,则values
每个键的每个键只是数据中与函数中定义的值匹配的所有值的数组key
.