Алгоритм определения меток и позиций оси Y? - PullRequest
3 голосов
/ 09 июня 2011

Учитывая массив значений y, например [-3400, -1000, 500, 1200, 3790], как определить «хорошие» метки оси Y и расположить их на сетке?

           ^
---(6,000)-|---
           |
---(4,000)-|---
           |
---(2,000)-|---
           |
<------(0)-+---------------------------------------->
           |
--(-2,000)-|---
           |
--(-4,000)-|---
           V

1 Ответ

4 голосов
/ 09 июня 2011

Вы можете сделать это следующим образом:

  1. Подсчитайте, сколько этикеток вы хотите иметь (n).Результат может иметь не так много меток, но он будет близок.У меня будет n = 6.
  2. Решите, какие цифры вы считаете «симпатичными».Вы хотите видеть только шаги типа 1, 2, 5, 10, 20, 50,… (в данном случае красивые цифры 1, 2 и 5) или шаги как 1, 2, 4, 5, 6, 8?10, тоже хорошо?Я собираюсь рассмотреть только 1, 2 и 5.
  3. Определите минимум (min) и максимум (max) последовательности, остальные числа не имеют значения.(min = -3400, max = 3790)
  4. Рассчитайте идеальный, но некрасивый шаг между метками как uglyStep = (max - min) / (n - 2).Вычитаем два для метки внизу и вверху.(uglyStep = 1797)
  5. Рассчитайте порядок величины uglyStep как magnitude = 10 ^ floor(log10(uglyStep)).(magnitude = 1000)
  6. Выберите лучший симпатичный шаг, умножив величину на все симпатичные числа и на десять.Затем выберите номер с наименьшей разницей между ним и uglyStep.Это будет prettyStep.(prettyStep = 2000)
  7. Рассчитать положение нижней и верхней меток как bottom = floor(min / prettyStep) * prettyStep и top = ceil(max / prettyStep) * prettyStep.Обратите внимание, что / обозначает нормальное математическое деление, а не C-подобное целочисленное деление.(bottom = -4000, top = 4000)
  8. Каждое число от bottom до top, которое делится на prettyStep, будет иметь метку.(-4000, -2000, 0, 2000, 4000)

Это может потребовать некоторых модификаций, если вы не хотите, чтобы min и max были очень близки к bottom и top.

Кроме того, иногда он ведет себя несколько странно, например, для min = 0 и max = 3002 он выбирает 0, 500, 1000, 1500, 2000, 2500, 3000, 3500, но для max = 3005 он использует 0, 1000, 2000, 3000, 4000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...