2016-09-17 53 views
2

我正在通過Udacity的免費d3課程。d3.scale.pow(0.5)與d3.scale.sqrt()不同的值

我們正在努力的一項練習是根據輸入的平方根創建一個比例尺,例如,映射函數應該像

y = constant * sqrt(x) 

由於sqrt(x)相當於x^(0.5),我認爲d3.js以下兩件應該提供同樣的精確映射:

var y1 = d3.scale.sqrt().domain([52070,1380000000]).range([10,50]); 

var y2 = d3.scale.pow(0.5).domain([52070,1380000000]).range([10,50]); 

然而,當我地圖域的兩端之間的一個數,我得到不同的輸出:

Y1(1000000)= 10.836195102634587

Y2(1000000)= 10.027477268653174

有人能解釋什麼是我假設的缺陷,這兩個尺度是等價的?

謝謝!

回答

1

您正在將指數定義在錯誤的地方。設置你的pow()規模定義exponent這樣的:

var y2 = d3.scale.pow().exponent(0.5).domain([52070,1380000000]).range([10,50]); 

,你會得到正確的值,這兩個尺度:

console.log(y1(1000000))//returns 10.836195102634587 
console.log(y2(1000000))//returns 10.836195102634587 

這裏是一個工作片段:

var y1 = d3.scale.sqrt().domain([52070,1380000000]).range([10,50]); 
 

 
var y2 = d3.scale.pow().exponent(0.5).domain([52070,1380000000]).range([10,50]); 
 

 
console.log(y1(1000000)) 
 
console.log(y2(1000000))
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

說明:

您不應該在pow()的括號內放置任何值。你可以在這裏放置值,但它們不會有任何影響。所以,當你這樣做:

var y2 = d3.scale.pow(0.5).domain([52070,1380000000]).range([10,50]); 

這是相同的:

var y2 = d3.scale.pow().domain([52070,1380000000]).range([10,50]); 

它沒有exponent,並且使用的1默認值。因此,前兩行是相同的:

var y2 = d3.scale.pow().exponent(1).domain([52070,1380000000]).range([10,50]); 

這裏是另一個片斷來證明它:

var test1 = d3.scale.pow(0.5).domain([52070,1380000000]).range([10,50]); 
 
var test2 = d3.scale.pow().domain([52070,1380000000]).range([10,50]); 
 
var test3 = d3.scale.pow().exponent(1).domain([52070,1380000000]).range([10,50]); 
 

 
console.log(test1(1000000)); 
 
console.log(test2(1000000)); 
 
console.log(test3(1000000));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>