2013-10-31 109 views
0

我正在试图找到一种用于为我正在编写的图表引擎生成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轴的新范围。

我计算每个Y轴标签之间的距离如下:

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的情况下, h在我的一些标签中为负值。

我通过循环遍历labelCount来为标签集合添加标签,在我的情况下为5,并从前面的标签值减去标签范围。我从最大值开始。

+0

这是什么意思,不工作,看起来视觉上不愉快? – chill

+0

这意味着我在Y轴上得到负值。如果计算0 - > 3000的刻度范围,并尝试在labelCount上的循环中减去该刻度范围,则会发现刻度范围不会进入最大值labelCount次数。 –

+0

对我来说,你的算法看起来不错,只有我从范围的低端开始,最后一个标签可能高于范围,这对于图表来说不是问题IMO。 – chill

回答

0

作为参考,只有在Python(不讲JS)和你的一样:

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'])) 

PS。也许floor对数更好