2012-06-06 1 views
3

Я хочу отобразить три метки по оси y: min, middle и max. макс - мин = 9572. Самый простой способ найти середину является 9572/2 = 4786. Эти значения не хорошо так Excel, вероятно, увеличить интервал до 1000 и установить middle 500.Как вычислить основной блок числовой оси

Как вычислить хорошие значения для моей оси y, когда даны min и max? min и/или max может быть отрицательным.

ответ

2

Хороший вопрос! Недавно я решил подобную проблему в последнее время и то, что я сделал:

  1. Создать массив возможных шагов, что-то вроде [1, 2, 5, 10, 20, 25, 50, 75, 100, 200, 250 , 500, 750, 1000, 2000, 2500, 5000, 7500, 10000]
  2. Определите, сколько ярлыков вам нужно - я думаю, это 3
  3. Выберите шаг из массива. 9572/(3 - 1) = 4786, ближайший шаг - 5000. Вы можете сравнить расстояние до следующих и предыдущих шагов и выполнить индивидуальное округление здесь, например, если не округленный шаг на 20% меньше следующего шага, выберите следующий шаг, в противном случае предыдущий.
  4. Выберите подходящую начальную точку для минимальной метки. Возьмите свой фактический минимум, разделите его на выбранный шаг (5000). Вокруг результата (вы можете использовать floor для минимума и ceil для максимального) и умножить его на выбранный шаг. Например, если мин = -3400 и макс = 2700:

    scaleMin = пол (-3400/5000) * 5000 = -5000
    scaleMax = CEIL (2700/5000) * 5000 = 5000

Это даст три метки: -5000, 0 и 5000. Если вы можете переносить последнюю отметку по оси y ниже максимальный график, используйте не только пол (или пол). Вычислите, сколько максимумов графика процентов не указано, и добавьте один шаг, если это слишком много.

0

Может помочь реализовать реализацию на C#. Мой образец может не работать для отрицательных значений оси y. Надеюсь, это поможет кому-то!

private double GetMajorStep(double yAxisMax) 
    { 
     int[] stepArray = {1, 2, 5, 10, 20, 25, 50, 75, 100, 200, 250, 500, 750, 1000, 2000, 2500, 5000, 7500, 10000, 20000, 50000,100000, 500000,1000000}; 
     const int numLabels = 2; 
     var stepSize = (int) (yAxisMax/(numLabels - 1)); 
     var possibleSteps = stepArray.Where(p => p < stepSize).ToList(); 
     if (!possibleSteps.Any()) return stepSize; 

     var nearest = possibleSteps.OrderBy(x => Math.Abs((long)x - stepSize)).First(); 
     return nearest; 
    } 
Смежные вопросы