对数范围

时间:2014-03-19 15:33:15

标签: javascript d3.js crossfilter

我有一个非常稀疏的数据集,我想在具有对数刻度的直方图中绘制它。我希望X轴看起来类似于:

[1,10,100,1000,10000]

意味着第一个bin将包含成本为1-10的观察值,第二个bin将包含11-10个等等,最后一个bin将包含+10.000。

function (pow, min, max) {
    var range = [];         
    for (i = min; i < max; i++) {
        range.push(Math.pow(pow, i));
    }
    return range;
}

我能够生成给定的10次幂数组。现在,我想要的是将一组连续值映射到该数组,这意味着:

[1,23,2,105,2000,30000]

将输出为:

[1,10,1,100,1000,10000]

我尝试过使用d3.scale.threshold,但它似乎没有按预期工作。

2 个答案:

答案 0 :(得分:2)

如果您只是在寻找一个映射您的值的函数,那么您只需要一些简单的数学运算:

function f(x) {
  return Math.pow(10, Math.floor(Math.log(x) / Math.log(10)));
}

alert( f(1) );
alert( f(23) );
alert( f(2) );
alert( f(105) );
alert( f(2000) );
alert( f(30000) );

我对d3没有经验,所以我无法帮助你。

答案 1 :(得分:2)

根据您选择的阈值点,d3 Threshold Scale将定量数据集拆分为离散类别。

与简单线性比例不同,阈值比例的 最小值和最大值。相反,阈值比例的域是您要分割数据的阈值列表

与所有d3刻度一样,范围是所需的输出值。但是,对于阈值比例,范围内的输出值数必须等于阈值(域)值加上一个 的数量。范围中的第一个值分配给小于第一个阈值的值,范围中的第二个值分配给等于或大于第一个阈值但小于第二个阈值的值,依此类推,直到范围中的最后一个值被分配给等于或大于域中最后一个值的值。

因此,要将基于10的幂的正整数数组拆分为类别,可以使用10的幂作为,并使用一组描述类别的字符串作为范围

scale = d3.scale.threshold()
          .domain([1, 11, 101, 1001, 10001])
          .range(["<1", "1-10", "11-100", "101-1000", "1001-10,000", ">10,001"]);

当然,根据您使用的比例尺,@ Daniele Torino建议的自定义功能可能会更加通用,因为它不需要您指定高于/低于最高和最低阈值的所有内容都会聚集在一起同一类别。但如果 你想要什么,那么上面的阈值范围就应该这样做。

相关问题