我正在尝试找到一种算法,用于为我正在编写的图表引擎生成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 - >但是,当我有一系列的说法时,这些方法都不适合我,0 - > 3000。
在0 - >的情况下; 3000我的一些标签最终会出现负值。
我通过循环遍历labelCount将标签添加到标签集合中,在我的情况下它是5,并从前一个标签值中减去刻度范围。我从最大值开始。
答案 0 :(得分: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
更好