Мне нужно сделать график с оптимизированным максимальным значением оси y .
Текущий метод построения диаграмм, который я использую, просто использует максимальное значение всех графиков, затем делит его на десять и использует его в качестве линий сетки. Я не писал это.
Примечание об обновлении: Эти графики были изменены. Как только я исправил код, мои динамические графики начали работать, что делало этот вопрос бессмысленным (потому что в примерах больше не было ошибок). Я обновил их со статическими изображениями, но некоторые ответы содержат разные значения. Запомни.
До сих пор в феврале было от 12003 до 14003 входящих звонков. Информативно, но некрасиво.
Я бы хотел избежать диаграмм, которые выглядят так, будто обезьяна придумала y -осные числа.
Использование API Google Charts немного помогает, но это все-таки не совсем то, что я хочу.
Числа чистые, но вершина значения y всегда совпадает с максимальным значением на графике. Эта диаграмма масштабируется от 0 до 1357. Мне нужно рассчитать правильное значение 1400, , проблематично .
Я добавляю rbobby определение «хорошего» числа здесь, потому что это так хорошо объясняет.
- "Хороший" номер - это номер, который имеет 3 или меньше ненулевых цифр (например, 1230000)
- «Хорошее» число имеет те же или несколько ненулевых цифр, что и нулевое число (например, 1230 не хорошо, 1200 хорошо)
- Самыми хорошими числами являются числа, кратные 3 нулям (например, "1000", "1 000 000")
- Вторыми самыми хорошими числами являются числа с кратными 3 нулями плюс 2 нуля (например, "1 500 000", "1 200")
Решение
Я нашел способ получить желаемые результаты, используя модифицированную версию идеи Марка Рэнсома.
Кулак, код Марка Рэнсома определяет оптимальное расстояние между тиками, если указано количество тиков. Иногда это число в два раза превышает максимальное значение на графике, в зависимости от того, сколько линий сетки вы хотите.
Что я делаю, так это запускаю код Марка с 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)