Мне нужно составить диаграмму с максимальным значением максимальной оси y.
В текущем методе создания диаграмм просто используется максимальное значение всех графиков, затем делит его на десять и использует это как линии сетки. Я не писал это.
Обновить Примечание: Эти графики были изменены. Как только я исправил код, мои динамические графики начали работать, делая этот вопрос бессмысленным (потому что в примерах больше не было ошибок). Я обновил их со статическими изображениями, но некоторые ответы подтверждают разные значения. Запомни. alt text http://i42.tinypic.com/nwzr5s.jpg В феврале между входящими звонками было 12003 и 14003. Информативный, но уродливый.
Я бы хотел избежать диаграмм, которые выглядят так, как обезьяна придумала номера оси y.
Использование API диаграмм Google помогает немного, но это все еще не совсем то, что я хочу. Числа чистые, но верхняя часть значения y всегда совпадает с максимальным значением на графике. Эта диаграмма масштабируется от 0 до 1357. Мне нужно вычислить правильное значение 1400, проблематично.
Я забрасываю rbobby из-за "хорошего" номера здесь, потому что он так хорошо объясняет.
- "Хорошее" число - это число, которое содержит 3 или менее ненулевых цифр (например, 1230000).
- "Хорошее" число имеет одинаковые или несколько ненулевых цифр, чем нулевые цифры (например, 1230 не очень хорошо, 1200 - приятный).
- Самые красивые цифры - это те, у которых кратные 3 нули (например, "1,000", "1,000,000" ).
- Вторые самые приятные числа: onces с множеством из 3 нулей плюс 2 нуля (например, "1500 000", "1200" ).
Решение
alt text http://i43.tinypic.com/21jc0no.png Я нашел способ получить результаты, которые я хочу использовать модифицированную версию идеи Марка Рэнсом.
Fist, код Mark Ransom определяет оптимальное расстояние между тиками при задании количества тиков. Иногда это число больше, чем в два раза больше, чем самое высокое значение на графике, в зависимости от того, сколько строк сетки вы хотите.
Что я делаю, так это то, что я запускаю Mark с 5, 6, 7, 8, 9 и 10 сетками (тиками), чтобы определить, какая из них самая низкая. При значении 23 высота диаграммы составляет 25, а линия сетки - 5, 10, 15, 20 и 25. При значении 26 высота диаграммы составляет 30, а линии сетки - 5, 10, 15, 20, 25 и 30. Он имеет такое же расстояние между линиями сетки, но их больше.
Итак, вот шаги, которые нужно сделать, чтобы скопировать то, что делает Excel, чтобы все графики выглядели.
- Временно поднимите максимальное значение графика примерно на 5% (так что между верхней точкой графика и верхней частью области графика всегда есть пробел. Мы хотим, чтобы 99.9 округлялось до 120).
- Найдите оптимальное размещение сетки для сетки 5, 6, 7, 8, 9 и 10 линии.
- Выберите самый низкий из этих чисел. Помните количество линий сетки, которые потребовались для получения этого значения.
- Теперь у вас есть оптимальная высота диаграммы. Строки/бар никогда не будут опираться на верхнюю часть диаграммы, и у вас будет оптимальное количество тиков.
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);
}
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
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)