Javascript 为图表生成标签

Javascript 为图表生成标签,javascript,algorithm,charts,Javascript,Algorithm,Charts,我正试图找到一种算法,为我正在编写的图表引擎生成Y轴,目前正处于头发拉长阶段 四处搜索会产生各种解决方案,但我很难找到一个适合所有数据范围的解决方案 以下是到目前为止我得到的信息: // Raise the max and lower the min so that we get a prettier looking chart. var tickRangeMinMax = maxValue - minValue; var min = tickRangeMinMax * Math.round(m

我正试图找到一种算法,为我正在编写的图表引擎生成Y轴,目前正处于头发拉长阶段

四处搜索会产生各种解决方案,但我很难找到一个适合所有数据范围的解决方案

以下是到目前为止我得到的信息:

// Raise the max and lower the min so that we get a prettier looking chart.
var tickRangeMinMax = maxValue - minValue;
var min = tickRangeMinMax * Math.round(minValue / tickRangeMinMax);
var max = tickRangeMinMax * Math.round(1 + (maxValue / tickRangeMinMax));
这给了我一个新的范围,我想为它生成一个Y轴

我计算每个YAxis标签之间的距离,如下所示:

var ticks = tickRange(min, max, labelCount);

function tickRange(minVal, maxVal, tickCount) {        
    var range = maxVal - minVal;
    var unRoundedTicksSize = range / (tickCount - 1);
    var x = Math.ceil(log10(unRoundedTicksSize) - 1);
    var pow10X = Math.pow(10, x);
    var roundedTickRange = Math.ceil(unRoundedTicksSize / pow10X) * pow10X;

    return roundedTickRange;
}
我还尝试使用更简单的算法计算滴答声:

return (max - min) / labelCount
前一种方法适用于较小的范围,如23->200,但是当我的范围为0->3000时,这两种方法都不适用于我

在0->3000的情况下,我的一些标签中会出现负值


我通过循环labelCount(在我的例子中是5)并从上一个标签值中减去刻度范围,将标签添加到标签集合中。我从最大值开始。

仅供参考,仅在Python中与您的相同(不要说JS):


注:也许对数上的
floor
更好

不工作、看起来不舒服意味着什么?意味着我的Y轴上有负值。如果您计算0->3000的刻度范围,并尝试在labelCount上的循环中减去该刻度范围,您将观察到刻度范围没有进入最大值labelCount的次数。对我来说,您的算法看起来不错,只是我从范围的低端开始,最后一个标签可能在该范围之上,这对图表来说不是问题。谢谢@chill。这其实很有帮助。我决定切换循环,从最小值切换到最大值,正如预期的那样。我还改变了提高和降低边界的算法。以前生成的值太大(或太低),尤其是当您有一个或两个异常值时。
import math

def ticks (low, high, labels):
        nlabels = len(labels)
        tick = (high - low) / (nlabels - 1)
        x = math.floor(math.log10(tick))
        pow10x = math.pow(10,x)
        tick = int(math.ceil(tick/pow10x)*pow10x)
        return zip (range(low,high+tick,tick), labels)


print (ticks (0, 225, ['a', 'b', 'c', 'd', 'e']))