2017-02-16 3 views
2

私は、dc.jsの多次元データセットの連続変数に関連付けられた2つのヒストグラムをプロットしようとしています。これはdc.barChartコンポーネントで実現するのは簡単ですが、これらのヒストグラムを領域正規化したいと考えています。私の場合、ビンの幅は均一であるため、各ビン/グループの合計数を(binWidth * totCounts)で割るという問題がありません。crossfilter/dc.jsを使用してエリア正規化棒グラフを効率的にプロットするには?

var cf = crossfilter(data); 
var totCounts = cf.groupAll().value(); 
var histDimension = cf.dimension(function(d) { 
    return Math.floor(d.fieldOfInterest/binWidth) * binWidth; 
}); 
var histGroup = histDimension.group().reduceSum(function(d) { 
    return 1/(binWidth * totCounts); 
}); 

面積正規化された棒グラフにつながるんdc.jsと、このアプローチをカップリング:

は、私は、次の線に沿って何かを使用して正規化した領域だったこれらのヒストグラムの初期ビューをプロットすることができました。しかし、データのフィルタリングを開始すると、フィルタリングされたデータは再正規化されません。代わりに、ビューは常に、フィルタリングされていないデータセットの元の領域正規化のレンズを通してデータを表示します。

私はこれがなぜそうであるのか理解していますが、クロスフィルターのレデューサー機能はまだ初期正規化を使用しています...私が探しているものを達成するためのもっともらしく効果的な方法があるかどうかはわかりません。つまり、dc.jsプロットビューを常にフィルタリングされたデータセットに対して再正規化することができます。任意の単一のビン/グループの正規化には、すべてのグループ(totCounts)からの情報が必要だったため、効率的なクロスフィルタリングのための機能を減らす/実行する方法が定義されていないようです。

私が探していることを達成するためのいくつかの明白な方法がないか、これはcrossfilter/dc.jsで達成できるという希望を放棄すべきですか?私は正しい方向に私を指し示すかもしれないどんな入力も感謝します。

+0

は希望を捨てないでください!方法が常にある! – Gordon

答えて

2

私たちがここで行う必要があるのは、減少計算の中の因子totCountsであり、変化する合計に適応することができます。クロスフィルターは段階的に減量を計算するため、変更に応じて合計を再適用する方法はありません。

幸いにも、棒グラフのvalueAccessorはこれに最適です。実際には、分割を含むすべての削減には、常に値を読み取る(1回で済む)と、集計や削減が行われている間(何度も)に分割するほうが効率的であるため、ほとんどの場合、より良い選択です。

ここでは、合計を動的に計算する方法が必要です。これはgroupAllが最適です。この場合、現在のディメンションのフィルタは監視されないため、おそらくdimension.groupAll()が必要です。現在のグラフをフィルタリングして、それを合計しないようにすることは望ましくありません。一緒にこれらを置く

var cf = crossfilter(data); 
var histDimension = cf.dimension(function(d) { 
    return Math.floor(d.fieldOfInterest/binWidth) * binWidth; 
}); 
var totCounter = histDimension.groupAll(); 
var histGroup = histDimension.group(); // default reduceCount 

barChart 
    .valueAccessor(function(kv) { 
     var total = totCounter.value(); 
     return total && (kv.value/(binWidth * total)); 
    }) 
+0

ゴードン、とてもありがとう!これは完璧でした。この方法で 'valueAccessor'メソッドを使用することはできませんでしたが、今は完璧な意味があります。これと、dc.jsでのあなたの飽くなき努力に感謝します。優れたドキュメンテーションとあなた自身と他の定期的なコミュニティーメンバーのよく聞かれたすべての質問のために、dc.jsを拾うのはすごく楽しい経験でした。うまくいけば、コードベースにもっと慣れたら、私は貢献することができます。 Cheers – HamsterHuey

+0

ちょうど私がこの小さな編集を加えなければならないことを付け加えたいと思った。 'return kv.value /(binWidth *(totCounter.value()+ 0.01));'。そうでない場合、空の選択時に、ヒストグラム遷移アニメーションは、ゼロ除算のために返された値が「0」ではなく「Inf」であると仮定していたので、浮上して離れてグリッチしていました。 – HamsterHuey

+1

良い点、ゼロ除算が発生する場合は0を返すように私の好みの方法で編集しました。 – Gordon

関連する問題