我正在使用d3.js对.csv文件中的数据进行分组。我正在尝试使用d3.nest()
来按年份然后按状态来获取记录计数。
我的test.csv
包含
Year,Project,Status
2018,Project 1,InProgress
2018,Project 2,InProgress
2018,Project 3,InProgress
2017,Project 4,InProgress
2017,Project 5,Completed
2017,Project 6,InProgress
2016,Project 7,Completed
我的代码如下:
d3.csv("https://raw.githubusercontent.com/benubah/rconsortium_projects/master/test.csv")
.then(function(data) {
var stat = d3.nest()
.key(function(d) { return d.Year })
.key(function(d) { return d.Status })
.rollup(function(v) { return v.length })
.entries(data);
console.log(stat);
});
<script src="https://d3js.org/d3.v5.js"></script>
我期望输出(由于2018年没有Completed项目,请将Completed键设置为0):
[Object {
key: "2018",
values: [Object {
key: "InProgress",
value: 3
}, Object {
key: "Completed",
value: 0
}]
},
Object {
key: "2017",
values: [Object {
key: "InProgress",
value: 2
}, Object {
key: "Completed",
value: 1
}]
},
Object {
key: "2016",
values: [Object {
key: "InProgress",
value: 0
}, Object {
key: "Completed",
value: 1
}]
}]
但是我得到的实际输出是:
[Object {
key: "2018",
values: [Object {
key: "InProgress",
value: 3
}]
},
Object {
key: "2017",
values: [Object {
key: "InProgress",
value: 2
}, Object {
key: "Completed",
value: 1
}]
},
Object {
key: "2016",
values: [Object {
key: "Completed",
value: 1
}]
}]
答案 0 :(得分:2)
原因是源数据中不存在那些必须使用values: 0
生成条目的年份/状态组合。 d3仅迭代现有组合...
因此,您将不得不用自己的代码填补空白。它可以通过多种方式完成。一种是将.map
链接起来,在必要时添加缺少的values
条目:
d3.csv("https://raw.githubusercontent.com/benubah/rconsortium_projects/master/test.csv")
.then(function(data) {
var stat = d3.nest()
.key(d => d.Year)
.key(d => d.Status)
.rollup(v => v.length)
.entries(data)
.map(function (obj) {
if (obj.values.length === 1) {
if (obj.values[0].key == "Completed") {
obj.values.unshift({ key: "InProgress", values: 0 });
} else {
obj.values.push({ key: "Completed", values: 0 });
}
}
return obj;
});
console.log(stat);
});
<script src="https://d3js.org/d3.v5.js"></script>