2014-09-26 102 views
0

我是新來的直流&交叉過濾器,我有一些困難。使用交叉過濾器過濾和組合直方圖

我有一個數據文件有兩個維度,im和fm。每個範圍從[0,1000000]。但是,我想篩選[0,300000]之間的值,然後創建直方圖。

以下是我的代碼。當我進入print_filter(grp)到控制檯,我認爲它會顯示6組,每組5萬,0〜30000之間。但是它表明:

[object Object](17) = [ 
{"key":100000,"value":3776}, 
{"key":150000,"value":2192}, 
{"key":200000,"value":1098}, 
{"key":650000,"value":915}, 
{"key":800000,"value":824}, 
{"key":250000,"value":753}, 
{"key":500000,"value":652}, 
{"key":550000,"value":590}, 
{"key":900000,"value":567}, 
{"key":300000,"value":546}, 
{"key":350000,"value":538}, 
{"key":0,"value":527}, 
{"key":750000,"value":503}, 
{"key":400000,"value":483}, 
{"key":450000,"value":458}, 
{"key":600000,"value":299}, 
{"key":950000,"value":147} 
] 

超過30萬過濾器,並且還缺少一個「關鍵」對於500000

代碼:

d3.csv("imfmincome.csv", function(data1) { 
data = data1 
var ndx = crossfilter(data); 
var byim = ndx.dimension(function(d) { return d.parentincomeim; }); 
var byfm = ndx.dimension(function(d) { return d.parentincomefm; }); 
byim.filter([0,300000]) 
byfm.filter([0,300000]) 


var n_bins = 6; 
var xExtent = [0,300000]; 
var binWidth = (xExtent[1] - xExtent[0])/n_bins; 
var grp = byfm.group(function(d){return Math.floor(d/binWidth) * binWidth;}); 

chart = dc.barChart("#barChart"); 
chart 
    .width(200) 
    .height(180) 
    .margins({top: 15, right: 10, bottom: 20, left: 80}) 
    .dimension(byim) 
    .group(grp) 
    .round(Math.floor) 
    .centerBar(false) 
    .x(d3.scale.linear().domain([0,300000])) 
    .xAxis(); 

chart.xUnits(function(){return 10;}); 
chart.xAxis().tickValues([0,300000]); 

我打印功能:

function print_filter(filter){ 
var f=eval(filter); 
if (typeof(f.length) != "undefined") {}else{} 
if (typeof(f.top) != "undefined") {f=f.top(Infinity);}else{} 
if (typeof(f.dimension) != "undefined") {f=f.dimension(function(d) { return "";}).top(Infinity);}else{} 
console.log(filter+"("+f.length+") = "+JSON.stringify(f).replace("[","[\n\t").replace(/}\,/g,"},\n\t").replace("]","\n]")); 
} 

任何建議表示讚賞。謝謝!

回答

0

即使沒有數值,箱子仍然存在,所以從0到1,000,000的範圍並不奇怪。沒有50萬桶的事實可能僅僅意味着沒有500,000-550,000的觀察結果。

令人驚訝的是,以上30萬箱沒有價值爲0。雖然byfm不會遵守它自己的過濾器,byfm將觀察byim的過濾器。

是否有可能觀測到高parentincomefm但低parentincomeim

+0

嗯,有一些觀察與高'fm'和低'im',但輸出仍然很奇怪。感謝即使他們沒有任何價值的存儲箱上的註釋 - 但是我的代碼中沒有任何東西顯得怪異或缺失? – As3adTintin 2014-09-26 18:51:00

+0

我發現'print_filter'令人困惑;它似乎試圖一次做很多事情,並且不清楚它遵循的路徑。但除此之外,我認爲看起來很合理。爲了測試你的過濾器是否工作正常,你可以暫時嘗試'byim = ndx.dimension(function(d){return d.parentincomefm;});'(即將兩個維度指向同一列)箱子<300,000。 – Gordon 2014-09-26 18:59:46

+0

感謝您的回覆。事實證明,我的錯誤更加初學者......我導入了csv,並且數字被記錄爲字符串而不是數字 - 我假設過濾器很奇怪(這很有道理,是的)?感謝有關過濾器的信息,這些仍然有幫助。 – As3adTintin 2014-09-26 19:11:41