2014-06-14 60 views
3

我有兩個數據集具有相似的列/維但按行分組並且包含不同的度量。將一個Crossfilter數據集中的過濾器應用到另一個Crossfilter

例:

數據集1個

Year Category SubCategory Value01 Value02 
2000 Cars  Sport   10   11 
2000 Cars  Family   15   16 
2000 Boats  Sport   20   21 
2000 Boats  Family   25   26 
... 

數據集2

Year Category ValueA  ValueB 
2000 Cars  100  101 
2000 Boats  200  201 
... 

數據集1有它自己的crossfilter對象,數據集2具有一個單獨的crossfilter對象。我有多個dc.js圖表​​,其中一些與數據集1相關,一些與數據集1相關,一些與數據集2相關。

當dc.js圖表​​對數據集2中也存在的列/維過濾數據集1時,我希望將同樣的過濾器到數據集2.如何實現這一目標?

回答

3

我不認爲在crossfilter或dc.js中有這樣的自動方法。但是如果您願意推出自己的維度包裝器,則可以提供該維度包裝器而不是原始維度對象,並將其轉發給所有基礎維度。

編輯:基於下面@亞拉文的小提琴,這裏是一個「維鏡」這樣的作品,至少在這個簡單的例子:

function mirror_dimension() { 
    var dims = Array.prototype.slice.call(arguments, 0); 
    function mirror(fname) { 
     return function(v) { 
      dims.forEach(function(dim) { 
       dim[fname](v); 
      }); 
     }; 
    } 
    return { 
     filter: mirror('filter'), 
     filterExact: mirror('filterExact'), 
     filterRange: mirror('filterRange'), 
     filterFunction: mirror('filterFunction') 
    }; 
} 

它使用這個有點凌亂。對於你想從crossfilter A到鏡像到crossfilter B中的每個層面,你需要創建crossfilter B上鏡的尺寸,反之亦然:

// Creating the dimensions 
subject_DA = CFA.dimension(function(d){ return d.Subject; }); 
name_DA = CFA.dimension(function(d){ return d.Name; }); 
// mirror dimensions to receive events from crossfilter B 
mirror_subject_DA = CFA.dimension(function(d){ return d.Subject; }); 
mirror_name_DA = CFA.dimension(function(d){ return d.Name; }); 

subject_DB = CFB.dimension(function(d){ return d.Subject; }); 
name_DB = CFB.dimension(function(d){ return d.Name; }); 
// mirror dimensions to receive events from crossfilter A 
mirror_subject_DB = CFB.dimension(function(d){ return d.Subject; }); 
mirror_name_DB = CFB.dimension(function(d){ return d.Name; }); 

現在你綁在一起時,魚目混珠的圖表:

// subject Chart 
subjectAChart 
    .dimension(mirror_dimension(subject_DA, mirror_subject_DB)) 
    // ... 

// subject Chart 
subjectBChart 
    .dimension(mirror_dimension(subject_DB, mirror_subject_DA)) 
    // ... 

nameAChart 
    .dimension(mirror_dimension(name_DA, mirror_name_DB)) 
    // ... 

nameBChart 
    .dimension(mirror_dimension(name_DB, mirror_name_DA)) 
    // ... 

由於所有的圖表都implicitly on the same chart group,重繪事件將自動獲得它們之間的傳播,他們被過濾的時候。並且每個交叉過濾器上的每個過濾器操作都將應用到另一個交叉過濾器上的鏡像尺寸。

也許不是我想建議這樣做,但像往常一樣,它可以使工作。

這裏的小提琴:https://jsfiddle.net/gordonwoodhull/7dwn4y87/8/

+0

我與兩個數據集有相同的情況進行比較。如果我點擊數據集1中的一個項目,它將在數據集2圖表中反映相同。你能否告訴我一個更好的方法來處理這個問題。 –

+0

這是我所知道的最好的方式,除了@ Ethan的建議將數據組合成一個交叉過濾器(以便它成爲數據問題而不是邏輯問題)。你試過這個嗎?它是如何失敗的? – Gordon

+0

https://jsfiddle.net/caravinden/y8tts7eo/ @Gordon在這個例子中,我怎樣才能同步兩個圖形之間的點擊事件? –

2

@戈登的建議是一個很好的一個。

我通常通過將2個表合併成一個表(將ValueA和ValueB添加到數據集1的每一行),然後使用自定義分組爲每個唯一Year /年僅聚合一次ValueA和ValueB,分類組合。每個組都需要保存一個前面已經看到的密鑰的地圖和每個密鑰的計數,如果它是一個新的密鑰組合,則僅聚合ValueA或ValueB的值。這確實會導致複雜的分組邏輯,但可以避免需要在2個Crossfilter對象之間進行協調。

就我個人而言,我只是發現複雜的自定義組合比協調邏輯更易於測試和使用,但這不適用於所有人。