2013-11-21 28 views
1

默认情况下,在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方法做到这一点?

回答

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] 
+0

使用d3缩放功能很合理,谢谢! – dcochran