2016-11-05 77 views
6

我在d3中创建对数刻度时遇到了问题。如果设置为线性,则标尺运行正常。对数刻度返回NaN

这工作:

var myLinScale = d3.scale.linear() 
     .domain([0, 100]) 
     .range([50, 1150]); 

console.log(myLinScale(71)); //output = 831 

然而,这不起作用:

var myLogScale = d3.scale.log() 
     .domain([0, 100]) 
     .range([50, 1150]); 

console.log(myLogScale(71)); //output = NaN 

什么是错的对数刻度?

回答

8

更改您的域,以便它不包括或过零:

var myLogScale = d3.scale.log() 
 
     .domain([1e-6, 100])//domain doesn't include zero now 
 
     .range([50, 1150]); 
 

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

在上面的演示中,我正在使用1e-6,这是0.000001

说明:

的零对数是未定义的(或不定义)。例如,在基数10中,log(0)是一个数字x,因此提升到x的功率为10的零数......当然这个数字不存在。然而,当我们从正面接近零时,极限是负无穷。

在纯JavaScript:

console.log("Log of 0 is: " + Math.log(0))

因此,在JavaScript中,log(0)是负无穷大,或负无穷大。

如此说来,根据API

数标度必须具有一个专门阳性或仅负域;该域名不得包含或交叉零。 (重点是我的)