对数刻度返回 NaN

17

我在使用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个回答

27

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

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

这是由于D3 v5.8中的新Symlog比例尺,基于双对称对数变换,允许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-6,它是0.000001解释: 对数零未定义(或无定义)。例如,在以10为底的情况下,log(0) 是一个数字x,使得10的x次方等于零...当然,这个数字不存在。然而,当我们从正侧逼近零时,极限值为负无穷大。
在纯JavaScript中:

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

因此,在 JavaScript 中,log(0) 是负无穷大或减去无穷大。
话虽如此,根据API
引用:“对数刻度必须具有纯正的正域或负域;域不能包括或越过零。(强调是我的)”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接