对数刻度返回NaN

Pau*_*ine 8 javascript math logarithm d3.js

我有问题在d3中创建对数刻度.如果设置为线性,则刻度可以正常工作.

这有效:

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

console.log(myLinScale(71)); //output = 831
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用:

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

console.log(myLogScale(71)); //output = NaN
Run Code Online (Sandbox Code Playgroud)

对数刻度有什么问题?

Ger*_*ado 13

新解决方案(使用D3 v5.8)

超过2年后,这个问题最终得到了一个基于D3的答案,并不建议从域中删除0,就像我在原始答案中所做的那样(见下文).

这可能是由于D3 v5.8中的新Symlog标度,基于对称的对数变换,在域中允许0.

因此,使用您的域名和范围而不做任何修改:

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

console.log(myLogScale(71));
Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v5.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

或者甚至更短,使用D3 v5.8中的新比例构造器:

var myLogScale = d3.scaleSymlog([0, 100], [50, 1150]);

console.log(myLogScale(71));
Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v5.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


原始答案(适用于D3 v3)

更改您的域名,使其不包含或交叉零:

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

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

在我正在使用的上述演示中1e-6,即0.000001.

说明:

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

在纯JavaScript中:

console.log("Log of 0 is: " + Math.log(0))
Run Code Online (Sandbox Code Playgroud)

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

话虽如此,根据API:

对数标度必须具有完全正面或完全负面的域; 域名不得包含或交叉零.(强调我的)