d3.js - dc.js/crossfilter 维度(年/周)

标签 d3.js charts dc.js crossfilter

我无法制作正确的图表来显示按周(和不同年份)分组的数据。

伪 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/

相关文章:

javascript - 递归地(或迭代地)用 d3.js 制作一个嵌套的 html 表?

javascript - 修复响应式 SVG 脱离 Bootstrap 网格的问题?

javascript - 谷歌图表 : how to change color for negative values in Annotation Chart

javascript - Shield UI 条形图重叠

dc.js - 在没有交叉过滤器的情况下使用 dc.js

javascript - d3 if/else 设置颜色

javascript - d3 图有客户的时区而不是数据的

javascript - 在 SAPUI5 中使用 FacetFilters 在图表容器中进行过滤

javascript - dc.js 渲染条形图

javascript - 如何使用crossfilter和DC.js处理缺失数据?