2013-11-21 26 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