【问题标题】:Using Crossfilter to Filter and Group for Histogram使用 Crossfilter 对直方图进行过滤和分组
【发布时间】:2014-09-26 17:10:42
【问题描述】:

我是 dc 和 crossfilter 的新手,遇到了一些困难。

我有一个二维的数据文件,im 和 fm。每个范围从[0,1000000]。但是,我想过滤 [0,300000] 之间的值,然后创建一个直方图。

下面是我的代码。当我在控制台中输入print_filter(grp) 时,我认为它会显示 6 个组,每组 50,000 个,介于 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}
]

超过 300,000 过滤器,并且还缺少 500,000 的“键”。

代码:

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]"));
} 

感谢任何建议。谢谢!

【问题讨论】:

    标签: javascript d3.js dc.js crossfilter


    【解决方案1】:

    即使它们中没有值,这些 bin 仍然存在,因此从 0 到 1,000,000 的范围并不奇怪。没有 500,000 bin 的事实可能只是意味着没有 500,000-550,000 的观测值。

    令人惊讶的是,高于 300,000 的 bin 没有值 0。虽然 byfm 不会观察到自己的过滤器,但 byfm 会观察到 byim 的过滤器。

    是否可能存在parentincomefm 高但parentincomeim 低的观察?

    【讨论】:

    • hmmm,有几个观察值的高fm 和低im,但输出仍然很奇怪。感谢您对存在的垃圾箱的注释,即使它们没有值 - 但我的代码中没有任何东西对您来说看起来很奇怪或缺失?
    • 我发现print_filter 令人困惑;它似乎试图一次做很多事情,但不清楚它遵循的路径。但除此之外,我认为看起来很合理。要测试您的过滤器是否正常工作,您可以暂时尝试byim = ndx.dimension(function(d) { return d.parentincomefm; });(即将两个维度指向同一列)以查看您是否仅获得
    • 感谢您的回复。事实证明我的错误更加初学者......我正在导入csv并且数字被记录为字符串而不是数字 - 我认为这使过滤变得奇怪(这是有道理的,是的)?感谢您提供有关过滤器箱的信息,它们仍然很有帮助。
    • 啊,是的,每个人也遇到了那个。确实“0”
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多