【问题标题】:Logarithmic scale returns NaN对数刻度返回 NaN
【发布时间】:2017-03-19 05:54:14
【问题描述】:

我在 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

对数刻度有什么问题?

【问题讨论】:

    标签: javascript d3.js math logarithm


    【解决方案1】:

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

    2 年多后,这个问题终于有了一个基于 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-6,即0.000001

    说明:

    零的对数未定义(或未定义)。例如,以 10 为底,log(0) 是一个数字 x,因此 10 的 x 次方是零……当然,这个数字不存在。然而,当我们从正面接近零时,极限是负无穷大。

    在纯 JavaScript 中:

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

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

    话虽如此,根据API

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2012-12-03
      • 2013-01-09
      • 2011-11-01
      • 2019-06-05
      • 1970-01-01
      相关资源
      最近更新 更多