2014-03-19 42 views
0

我有一个非常稀疏的数据集,我想用直方图将其绘制成对数刻度。我想X轴看类似于:对数范围

[1,10,100,1000,10000]

含义,所述第一仓将包括1-10的成本的观察,所述第二11-10等,最后会是+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试过,但它似乎没有工作期待。

+0

阈值范围应该可以工作,但请注意,范围的长度必须比域的长度多一个,范围中的第一个值是小于*第一个阈值的元素的值在域中。 – AmeliaBR

+0

你能否给我一个提示,显然我做错了什么,但我看不到它是什么。 '范围= [1,11,101,1001,10001]; domain = [0,10000]; scale = d3.scale.threshold.domain(domain).range(range); 比例尺(10); //输出11,预期1 比例(11); //输出11,预计11' – albertfdp

回答

2

A 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建议的自定义函数可能更具多功能性,因为它不要求你指定最大和最小阈值,高于/低于所有阈值都会聚集在同一类别中。但是,如果你想要的,上面的阈值比例应该这样做。

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没有经验,所以我不能帮助你。