Поле tickCount для градиентных легенд

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

Роль tickCount в градиентной легенде

tickCount определяет ориентировочное число делений шкалы, которые должны быть отображены в легенде. В контексте градиентных легенд это означает:

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

Важно, что tickCount не задаёт строго фиксированный список значений. Это именно рекомендация системе генерации оси (или легенды), которая может быть скорректирована алгоритмами округления, «nice»-масштабирования и ограничениями по визуальному пространству.


Где применяется tickCount

В Vega-Lite параметр задаётся внутри объекта легенды, связанного с масштабом:

{
  "mark": "rect",
  "encoding": {
    "color": {
      "field": "value",
      "type": "quantitative",
      "scale": {
        "scheme": "viridis"
      },
      "legend": {
        "tickCount": 5
      }
    }
  }
}

В Vega (низкоуровневый JSON-спецификации) аналогичная настройка задаётся через конфигурацию легенды шкалы:

{
  "legends": [
    {
      "fill": "color",
      "tickCount": 7
    }
  ]
}

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

Для непрерывных шкал (quantitative, temporal) Vega использует алгоритмы генерации «приятных» делений. tickCount влияет на этот процесс следующим образом:

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

Если диапазон данных узкий, фактическое число тиков может быть меньше указанного. Если диапазон широкий — система может увеличить шаг между тиками, сохраняя читаемость.


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

Одним из ключевых факторов, влияющих на итоговый результат tickCount, является параметр nice у шкалы:

{
  "scale": {
    "type": "linear",
    "nice": true
  },
  "legend": {
    "tickCount": 6
  }
}

nice: true приводит к округлению границ домена к «человеко-читаемым» значениям, что может изменить фактическое распределение тиков.

В связке:

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

Поведение при градиентных легендах

В случае цветовых градиентов (continuous color ramps) tickCount не влияет на сам градиент, а только на:

  • подписи вдоль шкалы;
  • визуальные маркеры (если включены);
  • вспомогательные линии или риски.

Пример:

{
  "mark": "rect",
  "encoding": {
    "color": {
      "field": "temperature",
      "type": "quantitative",
      "scale": {
        "scheme": "redyellowblue"
      },
      "legend": {
        "orient": "right",
        "tickCount": 8
      }
    }
  }
}

Здесь градиент остаётся непрерывным, но подписи температуры будут распределены примерно в восьми точках диапазона.


Алгоритм выбора фактических значений

Внутренний процесс генерации тиков можно описать как последовательность шагов:

  1. Определение домена данных (domain).
  2. Применение nice (если включён).
  3. Оценка доступного пространства легенды.
  4. Интерпретация tickCount как желаемого количества делений.
  5. Выбор «красивого шага» (nice step).
  6. Генерация списка значений.
  7. Обрезка или перераспределение при конфликте с плотностью текста.

Таким образом, tickCount не гарантирует точного совпадения, а задаёт целевую плотность.


Сравнение с tickMinStep и values

tickCount часто используется вместе с другими параметрами, влияющими на поведение шкалы:

  • tickMinStep — минимальный допустимый шаг между значениями;
  • values — явное задание списка тиков;
  • format — форматирование подписей.

В отличие от них:

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

Пример жёсткого контроля:

{
  "legend": {
    "values": [0, 10, 20, 30, 40]
  }
}

Здесь tickCount игнорируется.


Особенности поведения в Vega-Lite и Vega

В Vega-Lite tickCount чаще всего применяется декларативно и автоматически интегрируется в систему шкал.

В Vega:

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

Влияние на читаемость градиентных шкал

Основная задача tickCount — управление визуальной нагрузкой:

  • малое значение (2–3) делает легенду слишком грубой;
  • среднее (4–8) обеспечивает баланс;
  • большое (10+) может перегрузить интерфейс и вызвать наложение подписей.

Для градиентных шкал особенно важно учитывать:

  • длину легенды;
  • формат чисел (целые, дробные, временные метки);
  • плотность интерфейса.

Поведение при времени и датах

Для временных шкал (temporal) tickCount взаимодействует с календарными интервалами:

{
  "legend": {
    "tickCount": 6
  }
}

При этом система может выбрать интервалы:

  • часы;
  • дни;
  • недели;
  • месяцы,

в зависимости от диапазона данных.


Ограничения и нюансы

При использовании tickCount в градиентных легендах следует учитывать:

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

Особенно заметно это проявляется в компактных визуализациях, где легенда ограничена по высоте.


Типичные сценарии использования

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

Во всех этих случаях tickCount служит механизмом балансировки между точностью интерпретации и визуальной простотой.