Javascript 如何减少交叉筛选组函数创建的存储桶数量?

Javascript 如何减少交叉筛选组函数创建的存储桶数量?,javascript,crossfilter,Javascript,Crossfilter,默认情况下,在交叉筛选维度上创建交叉筛选组时,组的大小将等于维度中唯一值的数量。例如,如果我这样做: var array = [1,1,1,2,2,2,3,3,4,5,5,6,6,7]; var dimension = crossfilter.dimension(array); var group = crossfilter.group(dimension); // group.size() will equal 7, as group is a representation of dimens

默认情况下,在交叉筛选维度上创建交叉筛选组时,组的大小将等于维度中唯一值的数量。例如,如果我这样做:

var array = [1,1,1,2,2,2,3,3,4,5,5,6,6,7];
var dimension = crossfilter.dimension(array);
var group = crossfilter.group(dimension);
// group.size() will equal 7, as group is a representation of dimension's unique values
这对于创建直方图和显示维度的分布非常有用

但是,如果您有数百个唯一值,那么将该组用于直方图将变得不太实际,因为您的直方图条对于您拥有的视图框来说太小,或者太小以至于观众无法识别(与交叉过滤器示例不同,我使用矩形而不是路径来更好地控制颜色)

我想减少crossfilter.group(dimension)创建的可能存储桶的数量,以便将具有唯一值的存储桶相互折叠

例如,如果我有一个包含300个唯一值bucket的组,我希望能够将这个数字减少到20(现在假设偶数拆分),其中原始300的前15个值被折叠到一个bucket中,接下来的15个值被折叠到另一个bucket中,依此类推,直到从原始300创建20个bucket为止


我只需要javascript就可以很容易地做到这一点,但我需要将表示粘在crossfilter对象上。有没有一种方法可以通过交叉过滤方法来实现这一点?

我使用了以下方法:

var array = [1,1,1,2,2,2,3,3,4,5,5,6,6,7];
var ndx = crossfilter(array);
var scale = d3.scale.quantize().domain([0, 10]).range(d3.range(1, 4));
var dimension = ndx.dimension(function(d) { return scale(d); });
// or, more concisely:
var dimension = ndx.dimension(scale);
var group = dimension.group();
这将创建一个
scale
函数,该函数将域映射到相应的“舍入”范围。看

请注意,域和范围不包括最大值,因此:

scale(0)  // 1
scale(9)  // 3
然后可以创建使用此重新映射函数的,并将它们累加起来

group.all()
的结果是:

[{key: 1, value: 8}, {key: 2, value: 5}, {key: 3, value: 1}]
您可能需要将关键点转换回原始域,以便用于直方图上的记号/标签或其他内容,您可以使用:

scale.invertExtent(1)  // [0, 3.33..]
scale.invertExtent(2)  // [3.33.., 6.66..]
scale.invertExtent(3)  // [6.66.., 10]

我使用的是这样的东西:

var array = [1,1,1,2,2,2,3,3,4,5,5,6,6,7];
var ndx = crossfilter(array);
var scale = d3.scale.quantize().domain([0, 10]).range(d3.range(1, 4));
var dimension = ndx.dimension(function(d) { return scale(d); });
// or, more concisely:
var dimension = ndx.dimension(scale);
var group = dimension.group();
这将创建一个
scale
函数,该函数将域映射到相应的“舍入”范围。看

请注意,域和范围不包括最大值,因此:

scale(0)  // 1
scale(9)  // 3
然后可以创建使用此重新映射函数的,并将它们累加起来

group.all()
的结果是:

[{key: 1, value: 8}, {key: 2, value: 5}, {key: 3, value: 1}]
您可能需要将关键点转换回原始域,以便用于直方图上的记号/标签或其他内容,您可以使用:

scale.invertExtent(1)  // [0, 3.33..]
scale.invertExtent(2)  // [3.33.., 6.66..]
scale.invertExtent(3)  // [6.66.., 10]