Поле scales в Vega

Роль scales в системе визуализации Vega

В спецификации Vega ключевая задача визуализации заключается в преобразовании данных в визуальные переменные: координаты, размеры, цвета, углы, прозрачность и другие визуальные характеристики. Центральным механизмом этого преобразования выступает блок scales.

scales задаёт функции отображения (mapping functions), которые переводят значения данных в визуальные значения. В отличие от императивных графических библиотек, где преобразования выполняются вручную в коде, Vega описывает их декларативно.

Основная формула поведения scale:

  • вход: домен данных (domain)
  • выход: диапазон визуальных значений (range)

Таким образом, scale является формальным мостом между данными и отрисовкой.


Структура поля scales

В Vega scales представляет собой массив объектов, каждый из которых описывает отдельное преобразование:

  • идентификатор масштаба
  • тип шкалы
  • входной домен
  • выходной диапазон
  • дополнительные параметры интерполяции и трансформации

Пример общей структуры:

"scales": [
  {
    "name": "xscale",
    "type": "linear",
    "domain": {"data": "table", "field": "value"},
    "range": "width"
  }
]

Каждый scale становится доступен через ссылки в marks, axes и legends.


Типы шкал (type)

Vega поддерживает широкий набор типов шкал, каждый из которых соответствует определённому виду данных.

linear

Линейное отображение числовых значений.

Используется для:

  • непрерывных чисел
  • измерений
  • физических величин

Поведение:

  • равномерное преобразование
  • сохраняет пропорции

log

Логарифмическое преобразование.

Используется для:

  • экспоненциальных данных
  • финансовых показателей
  • научных измерений с большим диапазоном значений

Особенность:

  • сжимает большие значения
  • увеличивает детализацию малых значений

ordinal

Категориальная шкала.

Используется для:

  • строковых категорий
  • дискретных наборов данных

Особенность:

  • не предполагает числового порядка
  • распределяет элементы равномерно или по порядку появления

band

Шкала для дискретных категорий с шириной полос.

Используется в:

  • bar charts
  • grouped visualizations

Особенность:

  • вычисляет положение и ширину полосы
  • поддерживает внутренние отступы (padding)

point

Похожа на band, но без ширины — только координаты точек.

Используется для:

  • scatter plots с категориальной осью
  • дискретных координатных сеток

time / utc

Шкалы для временных данных.

Используются для:

  • временных рядов
  • календарных данных

Различие:

  • time учитывает локальное время
  • utc работает в универсальном времени

Domain: входные данные шкалы

domain определяет, какие значения данных участвуют в преобразовании.

Варианты задания:

Автоматический домен

"domain": {"data": "table", "field": "price"}

Vega автоматически вычисляет:

  • минимум
  • максимум

Явный домен

"domain": [0, 100]

Используется для:

  • фиксации диапазона
  • синхронизации нескольких графиков

Домен с фильтрацией

"domain": {
  "data": "table",
  "field": "value",
  "sort": true
}

Позволяет контролировать порядок категорий.


Домены из нескольких источников

"domain": {
  "fields": [
    {"data": "a", "field": "x"},
    {"data": "b", "field": "x"}
  ]
}

Используется при объединении данных из разных таблиц.


Range: визуальный диапазон

range задаёт пространство, в которое отображаются значения domain.

Числовой диапазон

"range": [0, 500]

Связь с layout

"range": "width"

или

"range": "height"

Используется для автоматической привязки к размерам визуализации.


Цветовые диапазоны

"range": ["#ff0000", "#00ff00"]

или палитры:

"range": {"scheme": "category10"}

Interpolation и непрерывные переходы

Для цветовых и числовых шкал возможна интерполяция:

"interpolate": "rgb"

Поддерживаемые режимы:

  • rgb
  • lab
  • hcl

Особенность:

  • влияет на визуальную плавность градиентов
  • особенно важно для heatmap и choropleth карт

Padding и band scales

Для band и point шкал применяются параметры:

"padding": 0.1
"paddingInner": 0.05
"paddingOuter": 0.2

Функциональность:

  • управление расстоянием между элементами
  • контроль визуальной плотности

Reverse и направление шкалы

"reverse": true

Инвертирует отображение:

  • большие значения → слева/снизу
  • малые значения → справа/сверху

Используется для:

  • альтернативных визуальных кодировок
  • географических систем координат

Clamp и ограничение значений

"clamp": true

Ограничивает выходные значения диапазоном range.

Поведение:

  • значения вне domain «прижимаются» к границам
  • предотвращает выход графики за пределы холста

Zero и базовые оси

"zero": true

Добавляет автоматическое включение нулевой точки в domain.

Используется для:

  • bar charts
  • финансовых сравнений

Особенность:

  • обеспечивает корректную визуальную интерпретацию величин

Nice и округление domain

"nice": true

Автоматически округляет границы domain:

  • 2.37 → 2.5
  • 98.12 → 100

Используется для:

  • улучшения читаемости осей
  • упрощения восприятия шкалы

Multiple scales и композиция

В Vega часто используется несколько шкал одновременно:

  • xscale — горизонтальная ось
  • yscale — вертикальная ось
  • colorScale — цветовое кодирование
  • sizeScale — размер маркеров

Пример композиции:

"scales": [
  {
    "name": "xscale",
    "type": "linear",
    "domain": {"data": "table", "field": "x"},
    "range": "width"
  },
  {
    "name": "yscale",
    "type": "linear",
    "domain": {"data": "table", "field": "y"},
    "range": "height"
  },
  {
    "name": "color",
    "type": "ordinal",
    "domain": {"data": "table", "field": "category"},
    "range": {"scheme": "tableau10"}
  }
]

Связь scales с marks

Шкалы напрямую используются в marks:

"x": {"scale": "xscale", "field": "value"}

или

"fill": {"scale": "color", "field": "type"}

Принцип:

  • scale определяет преобразование
  • mark использует результат преобразования

Инверсия и вычисляемые выражения

Vega позволяет комбинировать scale с выражениями:

"x": {"scale": "xscale", "expr": "datum.value * 2"}

Это расширяет функциональность шкал:

  • предварительная трансформация данных
  • адаптация сложных вычислений

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

При большом объёме данных важны следующие аспекты:

  • предварительный расчёт domain
  • использование статических range
  • минимизация пересчёта шкал при обновлении данных

Оптимизационные практики:

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

Scale resolution и переиспользование

В спецификациях Vega шкалы могут:

  • переиспользоваться между mark-ами
  • синхронизировать разные визуальные элементы
  • обеспечивать согласованность визуального кодирования

Пример:

  • одна xscale для line chart и axis
  • одна color scale для legend и marks

Сравнение с Vega-Lite уровнем абстракции

В Vega-Lite scales также присутствуют, но:

  • генерируются автоматически
  • скрыты от прямого управления в большинстве случаев
  • настраиваются через упрощённые параметры (scale: {type, domain, range})

Vega предоставляет полный контроль, тогда как Vega-Lite — декларативную абстракцию поверх этих механизмов.


Итоговая модель поведения scales

Математически scale можно представить как функцию:

f: domain → range

где:

  • domain ∈ данных
  • range ∈ визуального пространства

Каждый тип scale определяет:

  • форму функции преобразования
  • ограничения
  • правила интерполяции
  • поведение при выходе за границы

Это делает scales фундаментальным уровнем всей архитектуры Vega-визуализаций.