我对dc.js / crossfilter / d3三连胜相当新,并且有关于为构建堆积区域图表分组变量的问题。我一直在关注像this one这样的教程,它们展示了如何生成时间序列图表。这非常有用,但是我定义图表.group()
方法的方法略有不同。在该示例中,作者具有{'date': somedate, 'http_404': 20, 'total': 340 ... }
形式的数据,其中每种类型的http请求具有与http密钥相关联的某种显式值。然后,可以直接使用.reduceSum()
方法按日期对{http:1}}进行分组整个http请求的数量。
然后,作者为每种类型的http请求定义一个变量,以便为每个类似的var hits = dateDim.group().reduceSum(function(d) {return d.total})
定义一个序列。然后将这些变量提供给代码中图表部分中的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()
方法,这可以简单地计算按天分割的记录总数,但我不确定如何拆分不同的组。我怀疑我的误解源于缺乏关于map-reduce启发式的整体知识,因此任何关于它的基础知识的指针,尤其是与crossfilter相关的指针都将受到高度赞赏。任何帮助将不胜感激。谢谢你的阅读。
更新:我已经能够绘制多个系列,但结果图表不正确。我已经尝试实现一个条件来检查记录所在的组,并将它们分配给变量,如:.reduceCount()
和B组相同。但是,当我绘制这些图时,我得到两个系列,它们在每个堆叠在彼此顶部的数据点上重复相同的值。对此问题的任何见解将不胜感激。
答案 0 :(得分: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; })