我一直在玩dc.js / crossfilter.js并遇到一个我无法绕过头脑的问题。我的数据坚持这种模式:
[2016-02-01, "Lorem ipsum", -45]
[2016-02-03, "Lorem ipsum", 34]
[2016-03-04, "Lorem ipsum", 101]
...
所以基本上是一个每天都有数值的时间序列。我想做什么:用一个单独的框绘制一个箱线图,显示月份的总和的中位数等(即一个月的总和由一个点反映,胡须显示所有月份的分位数)。这意味着我必须按月分组/求和以获得这些值:
[2016-02, 79]
[2016-03, 101]
...
我不知道如何在dc.js中做到这一点 - 如果我按月分组然后将其用于我的箱图,我每个月会得到一个盒子,这些措施会引用一些条目。这对dc.js来说是有意义的。框架,但那不是我想要的。
关于如何做到这一点的任何想法?谢谢你的帮助!
祝你好运
修改:
答案 0 :(得分:0)
是的,方框图期望group.all()
返回一组键/值对,其中值是一个数组数组。
当您需要重塑图表的交叉过滤数据时,fake group是目前最好的技术。这是一个实现dc.js使用的唯一方法的对象,(*) group.all()
,从crossfilter组中提取数据:
function one_bin(group, key) {
return {
all: function() {
return [{
key: key,
value: group.all().map(kv => kv.value)
}];
}
};
}
one_bin
获取原始组和密钥名称;它生成一个带有一个键/值的数组,其中键是键名,值是来自原始组的所有值的数组。
用one_bin
包裹原始群组并将其传递到方框图:
var box = dc.boxPlot('#box')
.width(200).height(500)
.dimension(monthDim) // this is actually wrong but can't brush anyway
.group(one_bin(monthGroup, 'all months'))
;
当然,刷子不起作用,但只有全部或全部与此图表的x维度无关。
示例小提琴:https://jsfiddle.net/q8m54cg3/15/
(*)因为dc.js 2.1; 2.0及以下版本也使用group.top(N)
。