我无法制作正确的图表来显示按周(和不同年份)分组的数据。
伪 SQL 会给出:
select sum ('task')
group by 'year', 'week' (and maybe later 'site')
我的数据看起来或多或少像这样:
{ "date" : "20150427", "week" : 18, "site" : "a" "task" : 3, }
{ "date" : "20150427", "week" : 18, "site" : "b" "task" : 4, }
{ "date" : "20150427", "week" : 18, "site" : "c" "task" : 2, }
{ "date" : "20150427", "week" : 18, "site" : "d" "task" : 3, }
{ "date" : "20150428", "week" : 18, "site" : "a" "task" : 3, }
{ "date" : "20150428", "week" : 18, "site" : "b" "task" : 3, }
{ "date" : "20150429", "week" : 18, "site" : "c" "task" : 2, }
{ "date" : "20150429", "week" : 18, "site" : "d" "task" : 3, }
{ "date" : "20140512", "week" : 20, "site" : "d" "task" : 6, }
{ "date" : "20140512", "week" : 20, "site" : "a" "task" : 6, }
{ "date" : "20140513", "week" : 20, "site" : "b" "task" : 4, }
{ "date" : "20140513", "week" : 20, "site" : "c" "task" : 1, }
{ "date" : "20140519", "week" : 21, "site" : "b" "task" : 2, }
{ "date" : "20140519", "week" : 21, "site" : "c" "task" : 1, }
{ "date" : "20140519", "week" : 21, "site" : "d" "task" : 3, }
{ "date" : "20140519", "week" : 21, "site" : "a" "task" : 1, }
{ "date" : "20140520", "week" : 21, "site" : "b" "task" : 2, }
{ "date" : "20140520", "week" : 21, "site" : "c" "task" : 3, }
{ "date" : "20140520", "week" : 21, "site" : "d" "task" : 1, }
{ "date" : "20140520", "week" : 21, "site" : "a" "task" : 1, }
这是我的数据示例,它可以有不同的年份、站点或任务
我尝试了这个,但它不起作用,因为 barChart 累积了所有年份的一周:
d3.json("/graph", function(dataJson) {
var dataTable = dc.dataTable("#dc-table-graph");
var barChart = dc.barChart("#chart-bar-ordersperweek");
var data = dataJson;
var dateFormat = d3.time.format("%Y%m%d");
data.forEach(function (d) { d.date = dateFormat.parse(d.date); });
//dimension
var dateDim = ndx.dimension(function (d) { return d.date; });
var weekDim = ndx.dimension(function(d) {return d.week;});
//group
var orderByWD = weekDim.group().reduceSum(function (d) { return d.task; });
barChart
.width(1000).height(250)
.dimension(weekDim)
.group(orderByWD)
.x(d3.scale.ordinal().domain(d3.range(minWeek.week-1,maxWeek.week+1)))
.xUnits(dc.units.ordinal)
.y(d3.scale.linear().domain([0, 6000]))
.margins({top: 20, right: 30, bottom: 50, left: 80})
.label(function(d) { return d.value})
;
dataTable.width(800).height(800)
.dimension(dateDim)
.group( function (d) { return 'Week ' + d.week} )
.size(5000)
.columns([
function (d) { var format = d3.format('02d');
return d.date.getFullYear() +'/'+ format(d.date.getMonth()+1) + '/' + format(d.date.getDate()); },
function (d) { return d.week; },
function (d) { return d.site; },
function (d) { return d.task; }
])
.sortBy( function (d) { return Number(d.date) + d.task; })
.order(d3.descending);
dataTable.on('renderlet', function(chart){
chart.selectAll('.dc-table-group').classed('info',true);
});
dc.renderAll();
我的目标是总结同一周发生的所有任务并将其绘制到行图上,当我选择一周时用所选周更新数据表。
在数据表中,如何按周分组的站点对任务进行求和(累积)?
感谢您的帮助
编辑 我添加了一个jsfiddle https://jsfiddle.net/d4qsd8wh/
最佳答案
因此,您需要做的是为数据表创建一个假“维度”。在您当前的方法中,您可以这样做:
// Actually a dimension keyed on week and site
var fakeDateDim = {
top: function(d) {
var m = dc.d3.map();
dateDim.top(Infinity).forEach(function(g) {
if(m.has(g.week + g.site)) {
m.get(g.week + g.site).task += g.task
} else {
// Create the "record"
m.set(g.week + g.site, {
week: g.week,
site: g.site,
task: g.task
})
}
})
return m.values();
}
}
然后在数据表中,使用该 fakeDateDim
代替当前的 dateDim
。 (您还必须删除日期和周的表格列。)
这是一个基于您整理的示例的工作示例:https://jsfiddle.net/s2c9rhxw/
请注意,您可以使用 d3.nest,正如 @ian-h 的答案中提到的,但它掩盖了您正在做的一些事情,所以我认为最好使用 Map 或 d3 等较低级别的构造。绘制 map ,直到您熟悉计算为止。无论您实际如何执行计算,关键是将其包装在 dc.js 能够使用的伪维度对象中。
关于d3.js - dc.js/crossfilter 维度(年/周),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34514182/