Поле tickCount и tickMinStep

В системах декларативной визуализации данных Vega и Vega-Lite разметка осей строится автоматически на основе диапазона данных, типа шкалы и параметров конфигурации. Ключевую роль в этом процессе играют параметры управления тик-марками (делениями): tickCount и tickMinStep. Они влияют не только на внешний вид оси, но и на читаемость визуализации, плотность информации и стабильность отображения при изменении данных.


Общий принцип генерации делений шкалы

При построении оси Vega-Lite использует алгоритм выбора «красивых» значений делений. Этот алгоритм:

  • анализирует диапазон значений шкалы;
  • подбирает шаг между делениями;
  • стремится минимизировать визуальный шум;
  • округляет значения до удобочитаемых чисел (1, 2, 5, 10 и их кратные).

Именно на этом этапе применяются ограничения, задаваемые через tickCount и tickMinStep, которые могут конкурировать друг с другом.


tickCount: желаемое количество делений

Параметр tickCount задаёт целевое число делений на оси.

Формально это не строгое ограничение, а рекомендация для алгоритма компоновки шкалы.

Поведение tickCount

  • задаёт ориентир количества тиков;
  • Vega-Lite пытается приблизиться к указанному числу, но не гарантирует его точного соблюдения;
  • влияет на вычисление шага между делениями;
  • может быть проигнорирован при конфликте с tickMinStep или ограничениями диапазона.

Примеры интерпретации

Если диапазон данных равен 0–100:

  • tickCount: 5 → примерно 5 делений: 0, 20, 40, 60, 80, 100
  • tickCount: 10 → попытка увеличить плотность: шаг около 10

Однако при «неудобных» диапазонах, например 0–97, фактические значения могут смещаться к округлённым границам (0, 20, 40, 60, 80, 100).


tickMinStep: минимальный допустимый шаг

Параметр tickMinStep задаёт нижнюю границу интервала между делениями.

Он используется для предотвращения слишком плотного размещения тиков, особенно при:

  • больших диапазонах данных с высокой детализацией;
  • автоматическом увеличении tickCount;
  • визуализациях с ограниченным пространством.

Поведение tickMinStep

  • запрещает шаг меньше заданного значения;
  • имеет приоритет над tickCount;
  • может уменьшить фактическое число делений;
  • стабилизирует визуализацию при масштабировании.

Взаимодействие tickCount и tickMinStep

Эти параметры работают совместно, но с разной степенью приоритета.

Основной принцип

  1. Сначала Vega-Lite пытается выполнить tickCount.
  2. Затем проверяет ограничение tickMinStep.
  3. Если конфликт возникает — приоритет получает tickMinStep.

Типичный конфликт

Диапазон: 0–100 Параметры:

{
  "tickCount": 20,
  "tickMinStep": 10
}

Логика:

  • tickCount требует шаг ~5;
  • tickMinStep запрещает шаг меньше 10;
  • итоговый шаг становится 10;
  • количество делений уменьшается до ~10.

Алгоритмическая интерпретация шкалы

Внутри Vega-Lite генерация тиков проходит через функцию выбора «nice ticks», где:

  • сначала вычисляется приблизительный шаг: [ step ]

  • затем шаг округляется до «красивого числа»;

  • затем применяется ограничение: [ step = (step, tickMinStep)]

  • после этого строится финальный набор значений.


Поведение при различных типах шкал

Линейная шкала (quantitative)

Наиболее чувствительна к обоим параметрам.

  • tickCount напрямую влияет на плотность;
  • tickMinStep ограничивает минимальную дистанцию между значениями.

Логарифмическая шкала

В логарифмических шкалах влияние tickCount ослаблено:

  • деления определяются степенями основания логарифма;
  • tickMinStep часто не имеет прямого смысла в линейной интерпретации;
  • итоговая сетка определяется математической структурой шкалы.

Примеры конфликтных конфигураций

Слишком плотная сетка

{
  "tickCount": 50,
  "tickMinStep": 5
}

Результат:

  • фактическое число тиков ограничивается диапазоном;
  • шаг стабилизируется на уровне 5;
  • tickCount фактически игнорируется.

Умеренная настройка

{
  "tickCount": 6,
  "tickMinStep": 10
}

Результат:

  • tickCount предлагает шаг ~16–17;
  • ограничение не мешает;
  • итоговая шкала близка к 6 делениям.

Жёсткое ограничение шага

{
  "tickCount": 12,
  "tickMinStep": 25
}

Результат:

  • шаг фиксируется на 25;
  • число тиков резко уменьшается;
  • ось становится разреженной независимо от пожеланий tickCount.

Влияние на визуальное восприятие

Комбинация tickCount и tickMinStep определяет три ключевых свойства оси:

  1. Плотность информации Чем меньше tickMinStep, тем больше делений.

  2. Читаемость Увеличение шага улучшает восприятие при больших диапазонах.

  3. Стабильность интерфейса tickMinStep предотвращает «прыгающие» оси при изменении данных.


Практическая модель выбора значений

Внутренне поведение можно представить как баланс:

  • tickCount отвечает за «желание» частоты делений;
  • tickMinStep отвечает за «физическое ограничение» плотности;
  • итоговое значение всегда является компромиссом между ними.

Особенности при динамических данных

При изменении входных данных Vega-Lite может:

  • пересчитывать диапазон оси;
  • менять шаг делений;
  • сохранять стабильность за счёт tickMinStep;
  • игнорировать tickCount при резких скачках диапазона.

Особенно заметно это в:

  • потоковых данных;
  • интерактивных дашбордах;
  • масштабируемых графиках.

Роль в конфигурации scale и axis

Оба параметра задаются в секции axis, но зависят от scale:

  • scale определяет диапазон и тип шкалы;
  • axis управляет отображением;
  • tickCount и tickMinStep работают только на уровне оси, не изменяя сами данные.

Типичные ошибки конфигурации

  • установка большого tickCount без учёта tickMinStep;
  • попытка добиться точного количества делений через tickCount (невозможно);
  • использование tickMinStep без понимания масштаба данных;
  • конфликт с nice: true, который дополнительно округляет диапазон.

Поведение при совместном использовании с nice

При включённом nice:

  • диапазон расширяется до «красивых» границ;
  • шаг делений становится ещё более округлённым;
  • влияние tickCount снижается;
  • tickMinStep становится основным стабилизатором шага.

Математическая интерпретация взаимодействия

Можно формализовать итоговый шаг как:

[ step_{final} = ((, tickMinStep))]

где nice() — функция округления к удобным числам.


Итоговая логика поведения системы осей

  • tickCount задаёт ориентир количества делений;
  • tickMinStep ограничивает минимальную плотность;
  • Vega-Lite вычисляет шаг как компромисс между этими параметрами;
  • итоговая ось всегда оптимизируется под читаемость и ограничения пространства;