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对"好"数字的暗示,因为它解释得很好.
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所做的一些步骤,以使图表更加流行.
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)
这来自之前的类似问题:
我用一种蛮力方法做到了这一点.首先,计算出可以放入空间的最大刻度标记数.将总值范围除以刻度数; 这是 刻度线的最小间距.现在计算对数基数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)