2014-03-19 41 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沒有經驗,所以我不能幫助你。