图表轴的步骤计算

时间:2013-08-18 18:43:52

标签: c# algorithm charts report axis-labels

我需要计算图表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 个答案:

答案 0 :(得分:0)

下面显示的实现是在python中。如果您熟练使用这两种语言,它的大多数元素都可以轻松直接转换为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的//运算符返回整数结果,**表示取幂。)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到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在两种情况之间有所不同,如上面第一个和最后一个示例行所示。虽然两个测试用例的总体跨度相同,但是size的110%,如果{tick}不在范围的末尾,则需要更大的tickSizeloValhiVal不再符合较小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

节目输出:

{{1}}