对数刻度返回NaN

时间:2016-11-05 13:41:50

标签: javascript d3.js math logarithm

我在d3中创建对数刻度时遇到问题。如果将刻度设置为线性,则刻度可以正常工作。

这有效:

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

对数刻度有什么问题?

1 个答案:

答案 0 :(得分:12)

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

经过两年多的时间,这个问题终于有一个基于D3的答案,不建议从域中删除0,就像我在原来的答案中所做的那样(见下文)。

这是可能的,因为D3 v5.8中的新Symlog scale基于by-symmetric log transformation,在域中允许0。

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

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

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

甚至更短,使用D3 v5.8中的新比例构造函数:

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

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

原始答案(D3 v3)

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

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-60.000001

<强>解释

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

纯JavaScript:

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

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

据说API

  

对数标度必须具有独占阳性或完全阴性结构域;域名不得包含或交叉零。 (强调我的)