合理优化的图表缩放

Gra*_*ant 32 algorithm math charts

我需要制作一个具有优化的y轴最大值的图表.

我制作图表的当前方法只是使用所有图形的最大值,然后将其除以10,并将其用作网格线.我没有写.

更新注意:这些图表已更改.一旦我修复了代码,我的动态图就开始工作,使这个问题变得荒谬(因为这些例子不再有任何错误).我用静态图像更新了这些,但是一些答案引用了不同的值.记在脑子里. alt text http://i42.tinypic.com/nwzr5s.jpg 2月到目前为止,有12003到14003个入站电话.信息性,但丑陋.

我想避免看起来像猴子的图表想出y轴数字.

使用谷歌图表API有点帮助,但它仍然不是我想要的. 替代文字 数字很​​干净,但y值的顶部始终与图表上的最大值相同.此图表从0到1357进行缩放.我需要计算1400的正确值,这是有问题的.


我在这里抛出了rbobby对"好"数字的暗示,因为它解释得很好.

  • "漂亮"数字是具有3个或更少非零数字的数字(例如1230000)
  • 一个"漂亮"的数字与零数字相同或几个非零数字(例如1230不好,1200很好)
  • 最好的数字是3个零的倍数(例如"1,000","1,000,000")
  • 第二个最好的数字是多个3个零加2个零的数据(例如"1,500,000","1,200")

alt text http://i43.tinypic.com/21jc0no.png 我找到了使用Mark Ransom想法的修改版本获得我想要的结果的方法.

当得到刻度数时,Mark Ransom的代码确定了刻度之间的最佳间距.有时这个数字最终会超过图表中最高值的两倍,具体取决于您想要的网格线数量.

我正在做的是我用5,6,7,8,9和10个网格线(刻度线)运行Mark的代码,以找出哪些是最低的.值为23时,图表的高度为25,网格线为5,10,15,20和25.值为26时,图表的高度为30,网格线为5,10 ,15,20,25和30.网格线之间的间距相同,但它们中的更多.

所以这里只是简单地复制Excel所做的一些步骤,以使图表更加流行.

  1. 暂时将图表的最高值提高约5%(这样图表的最高点和图表区域的顶部之间总会有一些空间.我们希望99.9向上舍入到120)
  2. 找到5,6,7,8,9和10个网格线的最佳网格线位置.
  3. 找出这些数字中最低的.记住获取该值所需的网格线数.
  4. 现在您拥有最佳的图表高度.线条/条形图永远不会与图表顶部相对应,并且您具有最佳的刻度数.

PHP:

function roundUp($maxValue){
    $optiMax = $maxValue * 2;
    for ($i = 5; $i <= 10; $i++){
        $tmpMaxValue = bestTick($maxValue,$i);
        if (($optiMax > $tmpMaxValue) and ($tmpMaxValue > ($maxValue + $maxValue * 0.05))){
            $optiMax = $tmpMaxValue;
            $optiTicks = $i;
        }
    }
    return $optiMax;
}
function bestTick($maxValue, $mostTicks){
    $minimum = $maxValue / $mostTicks;
    $magnitude = pow(10,floor(log($minimum) / log(10)));
    $residual = $minimum / $magnitude;
    if ($residual > 5){
        $tick = 10 * $magnitude;
    } elseif ($residual > 2) {
        $tick = 5 * $magnitude;
    } elseif ($residual > 1){
        $tick = 2 * $magnitude;
    } else {
        $tick = $magnitude;
    }
    return ($tick * $mostTicks);
}
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

import math

def BestTick(largest, mostticks):
    minimum = largest / mostticks
    magnitude = 10 ** math.floor(math.log(minimum) / math.log(10))
    residual = minimum / magnitude
    if residual > 5:
        tick = 10 * magnitude
    elif residual > 2:
        tick = 5 * magnitude
    elif residual > 1:
        tick = 2 * magnitude
    else:
        tick = magnitude
    return tick

value = int(input(""))
optMax = value * 2
for i in range(5,11):
    maxValue = BestTick(value,i) * i
    print maxValue
    if (optMax > maxValue) and (maxValue > value  + (value*.05)):
        optMax = maxValue
        optTicks = i
print "\nTest Value: " + str(value + (value * .05)) + "\n\nChart Height: " + str(optMax) + " Ticks: " + str(optTicks)
Run Code Online (Sandbox Code Playgroud)

Mar*_*som 5

这来自之前的类似问题:

图上"漂亮"网格线间隔的算法

我用一种蛮力方法做到了这一点.首先,计算出可以放入空间的最大刻度标记数.将总值范围除以刻度数; 这是 刻度线的最小间距.现在计算对数基数10的底数以得到刻度的大小,并除以该值.你应该得到1到10范围内的东西.只需选择大于或等于该值的圆数,然后乘以前面计算的对数.这是你的最终刻度线间距.

Python中的示例:

import math

def BestTick(largest, mostticks):
    minimum = largest / mostticks
    magnitude = 10 ** math.floor(math.log(minimum) / math.log(10))
    residual = minimum / magnitude
    if residual > 5:
        tick = 10 * magnitude
    elif residual > 2:
        tick = 5 * magnitude
    elif residual > 1:
        tick = 2 * magnitude
    else:
        tick = magnitude
    return tick
Run Code Online (Sandbox Code Playgroud)