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,并从前面的标签值减去标签范围。我从最大值开始。
这是什么意思,不工作,看起来视觉上不愉快? – chill
这意味着我在Y轴上得到负值。如果计算0 - > 3000的刻度范围,并尝试在labelCount上的循环中减去该刻度范围,则会发现刻度范围不会进入最大值labelCount次数。 –
对我来说,你的算法看起来不错,只有我从范围的低端开始,最后一个标签可能高于范围,这对于图表来说不是问题IMO。 – chill