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 軸を生成したい新しい範囲が得られます。

次のように、各 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) をループ処理し、前のラベル値から目盛り範囲を減算して、ラベル コレクションにラベルを追加します。私は最大値から始めます。

4

1 に答える 1

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対数の方が良いでしょう

于 2013-10-31T15:34:55.660 に答える