【发布时间】:2017-07-09 19:42:48
【问题描述】:
我正在尝试稍微扩展此问题中描述的问题:
dc.js and crossfilter reduce average counts per day of week
我想绘制一天中每小时的平均计数。我遵循了上面的解决方案,在自定义减少中按天计算值,唯一的变化是按小时计算维度。这似乎运作良好,可以在以下小提琴中看到:
http://jsfiddle.net/dolomite/6eeahs6z/73/
顶部条形图按小时显示平均计数,下部图表按小时显示总计数。所以第 22 小时的总计数为 47,平均计数为 4.2727...数据中有 11 天,所以这是正确的。
但是,当我单击工作日行图并筛选周日时,我得到了 4 小时 22 小时的总计数和平均值 0.3636... 计算平均值的分母仍然包括数据中的所有工作日,与我过滤的工作日无关。因此,虽然总计数已过滤为仅显示 4 表示星期日,但它除以数据中的总天数,而要求只是除以过滤器中选择的天数。
我知道解决方案在于修改自定义 reduce,但我被卡住了!任何关于我哪里出错的指示都将不胜感激。
hourAvgGroup = hourDim.group().reduce(
function (p, v) { // add
var day = d3.time.day(v.EventDate).getTime();
p.map.set(day, p.map.has(day) ? p.map.get(day) + 1 : 1);
p.avg = average_map(p.map);
return p;
},
function (p, v) { // remove
var day = d3.time.day(v.EventDate).getTime();
p.map.set(day, p.map.has(day) ? p.map.get(day) - 1 : 0);
p.avg = average_map(p.map);
return p;
},
function () { // init
return { map: d3.map(), avg: 0 };
}
)
function average_map(m) {
var sum = 0;
m.forEach(function(k, v) {
sum += v;
});
return m.size() ? sum / m.size() : 0;
}
【问题讨论】:
标签: dc.js crossfilter