使用reduceCount方法的堆叠面积图



我对dc.js/crossfilter/d3三合一相当陌生,并且有一个关于构建堆叠面积图的分组变量的问题。我一直在学习如何生成时间序列图表的教程。这真的很有用,但是我定义图表的.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启发式的全面了解,所以任何关于这方面的基础知识的指导,特别是关于交叉过滤的指导,都将非常感谢。任何帮助都将非常感激。谢谢你的阅读。

UPDATE:我已经能够绘制多个系列,但结果图是不正确的。我试过实现一个条件,检查记录所在的组,并将它们分配给变量,如:var group_A = dateDim.group().reduceCount(function(d) {if (d.group == "A") {return d.group} })和B组相同。然而,当我绘制这些图时,我得到了两个序列,它们在每个数据点上都有相同的值重叠在一起。

有很多方法可以做到这一点。要使它像您尝试的那样工作,您需要您的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(group, function(d) { return d["A"] || 0; })

相关内容

  • 没有找到相关文章