如何减少Crossfilter组功能创建的存储桶数量?

时间:2013-11-21 02:56:32

标签: javascript crossfilter

默认情况下,在Crossfilter维度上创建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 dimension's unique values

这对于创建直方图和显示维度的分布非常有用。

但是,如果您有数百个唯一值,则使用该组进行直方图变得不太实用,因为直方图条对于您拥有的视图框来说太小,或者太小而无法让观察者看到(并且不像在Crossfilter示例中,我使用矩形而不是路径来更好地控制颜色。)

我想减少crossfilter.group(维度)创建的可能存储桶的数量,以便将唯一值的存储桶折叠到另一个存储桶中。

例如,如果我有一个拥有300个唯一值桶的组,我希望能够将该数量减少到20(我们假设现在甚至是拆分),其中原始300的前15个值被折叠进入一个桶,接下来的15个进入另一个桶,依此类推,直到原始300只创建了20个桶。

我只需使用javascript即可轻松完成此操作,但我需要将表示粘贴到crossfilter对象上。有没有办法用crossfilter方法做到这一点?

1 个答案:

答案 0 :(得分:1)

我在这些方面使用了一些东西:

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函数,将域映射到范围,"舍入"作为适当的。请参阅quantize scale

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

scale(0)  // 1
scale(9)  // 3

然后可以创建dimension以使用此重新映射功能,group将对其进行计数。

group.all()的结果是:

[{key: 1, value: 8}, {key: 2, value: 5}, {key: 3, value: 1}]

您可能需要将键转换回原始域以用于直方图上的刻度/标签或其他任何内容,您可以使用scale.invertExtent来执行此操作:

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