1

チャートの y 軸のステップを計算して、常に 7 ティック (通常は特定のティック数) になるようにする必要があります。データの範囲は指定されていないため、y 軸の値は次のようになります。

-2、2、3

-105、0.5、10

-5、10、80.6、120など

チャートのティック数が常に同じになるようにステップを計算するアルゴリズム (特に C# の実装) はありますか?

数字の Fe:

-2, 2, 3 -4.5, -3, -1.5, 0, 1.5, 3, 4.5

-105, 0.5, 10 -125, -100, -75, -50, -25,0, 25 になります

あなたの助けを前もって感謝します:)

4

1 に答える 1

1

以下に示す実装は python です。両方の言語に熟練していれば、ほとんどの要素は簡単に直接 C# に変換できます。いくつかのステートメントでは、一連のifステートメントまたは別のアプローチが必要になる場合があります。

プログラムでは、最後の 4 行がメイン プログラムです。示されているように、main には 80 個のテスト ケースを生成するループがあり、サイズは 0.04 から約 200 まで幾何学的に増加します。より粗くテストする場合は、40 (サイズの数) をより小さい数に変更し、1.24 (幾何学的比率) をより大きな数。テストされたサイズごとに、メインはstepShow2 回呼び出されます。最初は の 10% からsize最大 110% までsizeのテスト範囲で、次に -28% から 82% までのテスト範囲で行われます。stepShowは、 を呼び出すテスト ルーチンです。これは、左端の目盛りの位置と目盛り間の間隔である とをstepCalc計算するアルゴリズムを具体化したルーチンです。leftTicktickSize

stepCalcspan = max(hiVal,0) - min(loVal,0)x=0 が目盛りの範囲に収まるようにします。次にdecade = 10**(math.log(span/6.0)//math.log(10))、スパンの 1/6 を超えない 10 の最大累乗を計算します。(Python の//演算子は整数の結果を返し、**べき乗を表します。) ティック サイズが 1 から 10 の間である可能性が高い場合multis = (1,1.5,2,3,5,10) if decade==1 else (1,2,5,10)はタプルを (1,1.5,2,3,5,10) に設定しますが、それ以外の場合は (1,2 multis,5,10)。ループ内のコードはfor m in multis:計算tickSizeleftTick値を計算します。それらが十分に大きくなると、ループから抜け出し、それらを返します。

このプログラムの出力では、各サイズの 2 つのテスト ケースの は通常同じtickSizeですが、もちろん leftTick最初のケースはゼロで、2 番目のケースは負です。いくつかの行の例を次に示します。(完全な出力はプログラムの後に表示されます。) 各 5 つの数値グループには の値が含まれますleftTick, loVal, hiVal, rightTick, tickSize

0.000   0.101   1.109   1.200   0.200    -0.500  -0.282   0.826   2.500   0.500 
0.000   0.238   2.621   3.000   0.500    -1.000  -0.667   1.954   2.000   0.500 
0.000   0.295   3.250   6.000   1.000    -1.000  -0.827   2.423   5.000   1.000 
0.000   0.563   6.197   9.000   1.500    -3.000  -1.577   4.619   6.000   1.500 
0.000   0.866   9.528  12.000   2.000    -4.000  -2.425   7.103   8.000   2.000 
0.000   1.074  11.815  12.000   2.000    -6.000  -3.007   8.807  12.000   3.000 

上記の例の行の最初と最後の行のように、サイズtickSizeによっては 2 つのケースで異なります。両方のテスト ケースで全体のスパンは同じですが、 の 110% ですが、0 ティックが範囲の最後にない場合は、より大きな値が必要sizeです。タプルに 10 を含めると、このケースが処理されます。tickSizeloValhiValtickSizemultis

def stepCalc(loVal, hiVal):
    import math
    span = max(hiVal,0) - min(loVal,0)  # have to have 0 in span
    decade = 10**(math.log(span/6.0)//math.log(10))
    multis = (1,1.5,2,3,5,10) if decade==1 else (1,2,5,10)
    for m in multis:
        tickSize = m * decade
        cover = 6.0 * tickSize;
        leftTick = 0 if loVal >= 0 else -cover if hiVal <= 0 else (loVal//tickSize)*tickSize
        if leftTick+cover >= hiVal: break
    return (leftTick, tickSize)

def stepShow(loVal, hiVal):
    (leftTick, tickSize) = stepCalc(loVal, hiVal)
    return ' {:7.3f} {:7.3f} {:7.3f} {:7.3f} {:7.3f} '.format(leftTick, loVal, hiVal, leftTick+6*tickSize, tickSize)

size = 0.04
for i in range(40):
    print stepShow(0.1*size, 1.1*size), stepShow(-0.28*size, 0.82*size)
    size *= 1.24

上記のコードは、目盛りの位置を対称化しようとはしていません。それをしたい場合は、コードを前に追加して、の倍数でreturn (leftTick, tickSize)減らすことができますが、上記の倍数は下よりも多くなります。leftTicktickSizetickSizehiValloVal

プログラム出力:

0.000   0.004   0.044   0.060   0.010    -0.020  -0.011   0.033   0.040   0.010 
0.000   0.005   0.055   0.060   0.010    -0.020  -0.014   0.041   0.040   0.010 
0.000   0.006   0.068   0.120   0.020    -0.020  -0.017   0.050   0.100   0.020 
0.000   0.008   0.084   0.120   0.020    -0.040  -0.021   0.063   0.080   0.020 
0.000   0.009   0.104   0.120   0.020    -0.040  -0.026   0.078   0.080   0.020 
0.000   0.012   0.129   0.300   0.050    -0.050  -0.033   0.096   0.250   0.050 
0.000   0.015   0.160   0.300   0.050    -0.050  -0.041   0.119   0.250   0.050 
0.000   0.018   0.198   0.300   0.050    -0.100  -0.050   0.148   0.200   0.050 
0.000   0.022   0.246   0.300   0.050    -0.100  -0.063   0.183   0.200   0.050 
0.000   0.028   0.305   0.600   0.100    -0.100  -0.078   0.227   0.500   0.100 
0.000   0.034   0.378   0.600   0.100    -0.100  -0.096   0.282   0.500   0.100 
0.000   0.043   0.469   0.600   0.100    -0.200  -0.119   0.350   0.400   0.100 
0.000   0.053   0.581   0.600   0.100    -0.200  -0.148   0.433   0.400   0.100 
0.000   0.066   0.721   1.200   0.200    -0.200  -0.184   0.537   1.000   0.200 
0.000   0.081   0.894   1.200   0.200    -0.400  -0.228   0.666   0.800   0.200 
0.000   0.101   1.109   1.200   0.200    -0.500  -0.282   0.826   2.500   0.500 
0.000   0.125   1.375   3.000   0.500    -0.500  -0.350   1.025   2.500   0.500 
0.000   0.155   1.705   3.000   0.500    -0.500  -0.434   1.271   2.500   0.500 
0.000   0.192   2.114   3.000   0.500    -1.000  -0.538   1.576   2.000   0.500 
0.000   0.238   2.621   3.000   0.500    -1.000  -0.667   1.954   2.000   0.500 
0.000   0.295   3.250   6.000   1.000    -1.000  -0.827   2.423   5.000   1.000 
0.000   0.366   4.030   6.000   1.000    -2.000  -1.026   3.004   4.000   1.000 
0.000   0.454   4.997   6.000   1.000    -2.000  -1.272   3.725   4.000   1.000 
0.000   0.563   6.197   9.000   1.500    -3.000  -1.577   4.619   6.000   1.500 
0.000   0.699   7.684   9.000   1.500    -3.000  -1.956   5.728   6.000   1.500 
0.000   0.866   9.528  12.000   2.000    -4.000  -2.425   7.103   8.000   2.000 
0.000   1.074  11.815  12.000   2.000    -6.000  -3.007   8.807  12.000   3.000 
0.000   1.332  14.650  18.000   3.000    -6.000  -3.729  10.921  12.000   3.000 
0.000   1.651  18.166  30.000   5.000    -5.000  -4.624  13.542  25.000   5.000 
0.000   2.048  22.526  30.000   5.000   -10.000  -5.734  16.792  20.000   5.000 
0.000   2.539  27.932  30.000   5.000   -10.000  -7.110  20.822  50.000  10.000 
0.000   3.149  34.636  60.000  10.000   -10.000  -8.816  25.819  50.000  10.000 
0.000   3.904  42.948  60.000  10.000   -20.000 -10.932  32.016  40.000  10.000 
0.000   4.841  53.256  60.000  10.000   -20.000 -13.556  39.700  40.000  10.000 
0.000   6.003  66.037 120.000  20.000   -20.000 -16.810  49.228 100.000  20.000 
0.000   7.444  81.886 120.000  20.000   -40.000 -20.844  61.043  80.000  20.000 
0.000   9.231 101.539 120.000  20.000   -40.000 -25.846  75.693  80.000  20.000 
0.000  11.446 125.908 300.000  50.000   -50.000 -32.049  93.859 250.000  50.000 
0.000  14.193 156.127 300.000  50.000   -50.000 -39.741 116.385 250.000  50.000 
0.000  17.600 193.597 300.000  50.000   -50.000 -49.279 144.318 250.000  50.000 
于 2013-08-19T07:32:03.063 に答える