拼合用d3.js嵌套创建的对象层次结构
我试图以这样的方式可视化团队协作数据:
图表中的不同颜色是不同的协作工件类型。
源代码中的数据如下所示:
var json = [
{
"teamLabel": "Team 1",
"created_date": "2013-01-09",
"typeLabel": "Email"
"count": "5"
},
{
"teamLabel": "Team 1",
"created_date": "2013-01-10",
"typeLabel": "Email"
"count": "7"
},
/* and of course, a lot more data of this kind */
]
请注意,数据是针对单日提供的。 因此,对于上面的可视化,我需要根据一年中的第一周来汇总数据。 团队名称和工件类型需要保留,并用作分组属性。 代码如下:
// "2013-01-09"
var dateFormat = d3.time.format.utc("%Y-%m-%d");
// "2013-02" for the 2nd week of the year
var yearWeek = d3.time.format.utc("%Y-%W");
var data = d3.nest().key(function(d) {
return d.teamLabel;
}).key(function(d) {
var created_date = dateFormat.parse(d.created_date);
return yearWeek(created_date);
})
.key(function(d) {
return d.typeLabel;
}).rollup(function(leaves) {
return d3.sum(leaves, function(d) {
return parseInt(d.count); // parse the integer
});
}
)
.map(json);
这会导致基于嵌套键的对象层次结构。 我没有看到如何从这里创建上面的图表,所以我正在寻找一种将data
转换为以下结构的方法:
[
// This list contains an element for each donut
{
"teamLabel": "Team 1",
"createdWeek": "2013-02",
"values": [
// This list contains one element for each type we found
{
"typeLabel": "Email",
"count": 12
},
{
...
}
]
},
{
...
}
]
这种方式,我可以使用createdWeek
和teamLabel
分别对x轴和y轴定位,而根据信息values
可以被传递到d3.layout.pie()
有没有干净的方式来做这个数据转换? 如果您需要任何澄清或进一步的细节,请让我知道。
这就是你如何做到的:
var flat = data.entries().map(function(d){
return d.value.entries().map(function(e){
return {
"teamLabel": d.key,
"createdWeek": e.key,
"values": e.value.entries().map(function(f){
return {"typeLabel": f.key, "count": f.value}
})
}
})
}).reduce(function(d1,d2){ return d1.concat(d2) },[]);
请注意,我使用d3.map代替标准JavaScript对象,以便使用map.entries()辅助函数。 我想这就是你试图用你正在使用的事实来判断:
.map(json); // whereas I used .map(json, d3.map)
代替
.entries(json);
jsFiddle链接在这里:
http://jsfiddle.net/RFontana/KhX2n/
链接地址: http://www.djcxy.com/p/11717.html