d3 v4中的d3.ticks()通常给出一个低于该范围中最高值的顶部刻度值

时间:2016-08-31 14:20:08

标签: d3.js

In D3 version 4's D3-array moduled3.ticks()接受一个数组并输出一个适合图表轴标签的精确舍入值数组:

  

d3.ticks(start, stop, count)

     

在start和stop(包括)之间返回一个近似计数+ 1均匀间隔,精确舍入的值的数组。每个值是10的幂乘以1,2或5.另请参阅tickSteplinear.ticks ...

     

Ticks是包容性的,因为它们可能包含指定的起始值和停止值,如果(并且仅当)它们是精确的,精确舍入的值与推断的步骤一致。更正式地说,每个返回的tick t满足start≤t和t≤stop。

然而,我没有得到我期望的结果。例如,为此:

  d3.ticks( 0, 63500, 7 );

我希望输出如下:

  [ 0, 10000, 20000, 30000, 40000, 50000, 60000, 70000 ]

相反,我得到的是:

  [ 0, 10000, 20000, 30000, 40000, 50000, 60000 ]

...其中我的最高价值(63500)大于我图表的最高价格,这意味着我期望一个价值延伸到图表之外。

请求不同数量的刻度并没有解决它:

  • ( 0, 63500, 8 )提供相同的内容
  • ( 0, 63500, 9 )也提供相同的
  • ( 0, 63500, 10 )提供[0, 5000, 10000, 15000, 20000, 25000, 30000, 35000, 40000, 45000, 50000, 55000, 60000],这不是更好
  • 从随机试验和错误中,我发现实际超出最大值的唯一输入是24,其中[0, 2000, 4000, ... 62000, 64000]
  • 这是一个可以传递任何数据集的函数,因此它不需要为每个数据集选择一个精选的滴答数

为什么会发生这种情况(我是否误解了某些内容,或者这是否违反了#s;t≤t停止")来自文档?),我如何确保我的刻度覆盖我的范围?

我已经看到问题d3.js scale doesn't place tick at the top,其中描述了D3版本3中的类似问题,并附有说明:

enter image description here

...但版本4中的功能不同,答案中的文档链接不适用于D3版本4.

我已查看D3-Scale - linear.ticks()的链接似乎已被破坏 - 但我并不理解为什么我要做的事情需要一个全新的D3子模块和缩放算法。

1 个答案:

答案 0 :(得分:0)

试试这个

getRoundedYMaxValue(number) {
        var numLen = number.toString().length;
        var dividerValue = "1"
        for (var i = 0; i < numLen - 1; i++) {
            dividerValue += 0
        }
        return Math.ceil(number / dividerValue) * dividerValue
    }