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

我对dc.js / crossfilter / d3 trifecta相当陌生,并且对构建堆栈面积图的变量进行分组存在疑问。 我一直在学习像这样的教程,展示如何生成时间序列图表。 这非常有用,但是我定义图表的.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()这些用作一个.stack() 。 我知道我需要使用.reduceCount()方法,并且这可以简单地计算每天分割的记录总数,但我不确定如何分割不同的组。 我怀疑我的误解是由于缺乏关于map-reduce启发式的总体知识,因此任何有关基础知识的指针,尤其是与crossfilter有关的指针都将不胜感激。 任何帮助将不胜感激。 谢谢阅读。

更新:我已经能够绘制多个系列,但是我得到的图形不正确。 我已经尝试实现一个条件来检查记录在哪个组中,并将它们赋值给变量,如下所示: 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; })
链接地址: http://www.djcxy.com/p/5597.html

上一篇: dc.js: stacked area chart using reduceCount method

下一篇: How to achieve dimensional charting on large dataset?