2013-08-18 26 views
1

我需要計算圖表的y軸步驟,以便它始終有7個刻度(通常爲特定數量的刻度)。的數據的範圍沒有被指定爲這樣的y軸的值可以是這樣的:圖表軸的步進計算

-2,2,3

-105,0.5%,10

-5,10,80.6 ,120等

是否有任何算法(尤其是C#實現)將計算圖表始終具有相同數量的刻度的步驟?

F.e.爲數字:

-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

在您的幫助:)

+1

什麼是對蜱的價值觀的約束?否則,(maxvalue-minvalue)/ 7總是返回解決方案... – Save

+0

我忘記了寫。數值0必須始終有一個勾號。它可以位於底部(如果所有值均爲正值),頂部(如果所有值均爲負值)或位於軸的中間。 – grechut

+0

蜱的值也必須「合理」。 所以f.e.如果maxValue == 90和minValue == 10,最大滴答應該是120並且步驟== 20. 步長值不應該像5.232324324等 – grechut

回答

0

如下圖所示的實施千恩萬謝是蟒蛇。如果你熟練使用這兩種語言,它的大多數元素都可以輕鬆地直接轉換爲C#。一些陳述可能需要一系列if陳述或不同的方法。

在程序中,最後四行是主程序。如圖所示,main有一個循環來生成80個測試用例,其尺寸從幾何上從0.04增加到約200.如果要測試更粗糙,則將40(尺寸數量)更改爲更小的數字,將1.24(幾何比率)更改爲一個更大的數字。對於每個測試尺寸,主調用stepShow兩次,首先測試範圍從size的10%到size的110%,然後測試範圍從-28%到82%。 stepShow是一個測試例程,它調用stepCalc,這是一個例程,它包含一個算法來計算leftTicktickSize,它們是最左邊的刻度的位置和刻度之間的間隔。

stepCalcspan = max(hiVal,0) - min(loVal,0)開頭,它確保x = 0將適合滴答的範圍。然後decade = 10**(math.log(span/6.0)//math.log(10))計算10的最大冪不大於跨度的1/6。 (Python的//運算符返回一個整數結果,而**表示冪運算。)如果刻度大小可能介於1和10之間,multis = (1,1.5,2,3,5,10) if decade==1 else (1,2,5,10)將元組multis設置爲(1,1.5,2,3,5,10),否則將其設置爲(1,2,5,10)。循環中的代碼for m in multis:計算tickSizeleftTick值;當它們足夠大時,它會跳出循環並返回它們。

在該程序的輸出中,每個尺寸的兩個測試用例通常會有相同的tickSize,但當然leftTick對於第一種情況爲零,對於第二種情況爲負數。以下是一些示例行。 (完整輸出顯示在程序後面。)每個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不同這兩種情況之間,如在第一個和最後上面的例子中的行。儘管在兩種測試情況下總體跨度相同,但或hiVal不再適合較小的範圍覆蓋的跨度時,如果0 tick不在範圍的末尾,則需要size的110%,較大的tickSize值值爲tickSize。在multis元組中包含10個元組處理這種情況。

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)之前添加代碼,以leftTick減少tickSize的倍數,而tickSize的上述hiVal的倍數多於loVal以下的倍數。

程序的輸出:

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