首页 文章

dc.js:使用reduceCount方法的堆积面积图

提问于
浏览
1

我'm fairly new to the dc.js/crossfilter/d3 trifecta, and have a question about grouping variables for building a stacked area chart. I'已经按照this one这样的教程展示了如何生成时间序列图表 . 这非常有用,但是我定义图表的 .group() 方法的方法略有不同 . 在该示例中,作者具有 {'date': somedate, 'http_404': 20, 'total': 340 ... } 形式的数据,其中每种类型的http请求具有与http密钥相关联的某种显式值 . 然后,直接使用 .reduceSum() 方法按日期分组整个http请求的数量,如 var hits = dateDim.group().reduceSum(function(d) {return d.total}) .

然后,作者为每种类型的http请求定义一个变量,以便为每个类型定义一个系列,如此 var http_404 = dateDim.group().reduceSum(function(d) {return d.http_404}) . 然后将这些变量提供给代码中图表部分中的 .group().stack() 方法 . 这对我来说很有意义 . 但是,我正在使用数据,其中我想要绘制的变量没有预先计算的值,而是我需要简单地计算数据中包含特定值的记录数 . 所以我有一些形式:

'name', 'occupation', 'group', 'date_joined' 'John', 'plumber', 'A', '12/01/01' 'Jane', 'programmer', 'B', '12/22/04' 'Jim', 'manager', 'B', '1/8/05' 'Jill', 'motivational speaker', 'A', '5/14/12'

我需要能够计算某个群体中有多少人并将其作为一个系列随着时间的推移进行绘制,并在我创建的时间图表中将其用作 .stack() . 我知道我需要使用 .reduceCount() 方法,这可以简单地计算按天分割的记录总数,但我不确定如何拆分不同的组 . 我怀疑我的误解源于缺乏关于map-reduce启发式的整体知识,因此任何关于它的基础知识的指针,尤其是与crossfilter相关的指针都将受到高度赞赏 . 任何帮助将不胜感激 . 谢谢阅读 .

UPDATE: 我've been able to plot multiple series, but I the resulting graph is incorrect. I'已尝试实施一个条件,检查记录所在的组并将它们分配给变量,如下所示: var group_A = dateDim.group().reduceCount(function(d) {if (d.group == "A") {return d.group} }) 和B组相同 . 但是,当我绘制这些图时,我得到两个系列,它们在每个堆叠在彼此顶部的数据点上具有相同的值 . 任何关于这个问题的见解将不胜感激 .

1 回答

  • 1

    有很多方法可以做到这一点 . 为了让它以您尝试的方式工作,您将希望您的reduce函数(总是)返回一个值,所以

    var group_A = dateDim.group().reduceCount(function(d) {
        if (d.group == "A") return 1; 
        else return 0; 
    });
    

    人们通常做的另一件事是将所有值减少到一个复合组:

    var group = dateDim.group().reduce(function(p, d) {
        p[d.group] = (p[d.group] || 0) + 1;
        return p;  
      },
      function(p, d) {
        --p[d.group];
        return p;
      },
      function() { return {}; }
    );
    

    然后你将使用stack calls的访问器:

    .stack(group, function(d) { return d["A"] || 0; })
    

相关问题