Поля domain и range

domain и range являются фундаментальными свойствами системы масштабирования в Vega и Vega-Lite, определяющими, как исходные данные преобразуются в визуальные координаты, цвета, размеры и другие эстетические параметры визуализации. Эти поля описывают пространство входных значений и пространство выходных отображаемых значений, формируя математическое соответствие между данными и графическим представлением.

domain задаёт набор значений, которые считаются «входом» для шкалы (scale). Это исходная область данных, которая подлежит преобразованию.

В Vega-Lite domain может задаваться несколькими способами:

  • Автоматически на основе данных
  • Явно через массив значений
  • Через поля данных (field-based domain)
  • С использованием выражений трансформации

Автоматическое определение domain

В большинстве случаев Vega-Lite выводит domain автоматически из данных, привязанных к шкале. Например, при построении линейного графика по числовому полю:

"scale": {
  "domain": "data"
}

При таком подходе система анализирует выбранное поле и определяет минимальное и максимальное значения (для количественных данных) или полный набор уникальных категорий (для номинальных данных).

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

  • min(data[field])
  • max(data[field])

Для категориальных:

  • список уникальных значений

Явное задание domain

domain может задаваться вручную, если требуется контроль над отображаемым диапазоном:

"scale": {
  "domain": [0, 100]
}

Такой подход фиксирует границы шкалы независимо от данных. Это критически важно при:

  • сравнении нескольких графиков
  • унификации осей
  • создании индикаторов и прогресс-баров

domain для категориальных шкал

В случае дискретных данных domain задаёт порядок категорий:

"scale": {
  "domain": ["A", "B", "C", "D"]
}

Порядок в массиве напрямую определяет визуальный порядок на оси или в цветовой шкале. Это позволяет:

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

domain из полей данных

Vega-Lite поддерживает привязку domain к конкретному полю:

"scale": {
  "domain": {
    "field": "category"
  }
}

В этом случае система извлекает все значения указанного поля и формирует domain динамически.

Расширенная форма:

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

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

range: пространство выходных значений

range определяет, в какие визуальные значения преобразуются данные из domain. Это «выходное пространство», в котором работают пиксели, цвета, размеры, углы и другие графические параметры.

range зависит от типа шкалы:

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

числовой range

Для осевых шкал range обычно задаёт диапазон пикселей:

"scale": {
  "range": [0, 400]
}

Это означает, что минимальное значение domain будет отображено в 0 пикселей, максимальное — в 400.

Важно учитывать инверсию:

  • [0, width] — стандартная ориентация
  • [height, 0] — инвертированная ось Y (часто в SVG)

категориальный range

Для категориальных данных range задаёт список дискретных визуальных значений:

"scale": {
  "range": ["red", "blue", "green"]
}

Каждой категории из domain сопоставляется соответствующий элемент range. Если категорий больше, чем значений в range, применяется циклическое повторение.

цветовые шкалы

В Vega и Vega-Lite цветовые шкалы используют range для определения палитры:

"scale": {
  "type": "ordinal",
  "range": "category"
}

Здесь range может ссылаться на предопределённые палитры:

  • category
  • heatmap
  • ramp
  • diverging

Также допускается пользовательский список цветов:

"range": ["#1f77b4", "#ff7f0e", "#2ca02c"]

непрерывные цветовые диапазоны

Для количественных данных используется интерполяция:

"scale": {
  "type": "linear",
  "range": ["#ffffff", "#000000"]
}

Значения между крайними точками domain интерполируются по цветовой шкале.

связь domain и range

Связь между domain и range задаётся функцией масштабирования:

f(x): domain → range

Для линейных шкал используется формула:

(x - d_min) / (d_max - d_min) → нормализованное значение

Далее нормализованное значение проецируется на range.

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

index(domain_value) → range[index]

типы шкал и влияние на domain/range

linear scale

  • domain: [min, max]
  • range: [pixel_start, pixel_end]
  • используется для непрерывных данных

log scale

domain должен содержать положительные значения:

"scale": {
  "type": "log",
  "domain": [1, 1000]
}

range остаётся линейным, но преобразование нелинейное.

band scale

Используется для категорий:

  • domain: категории
  • range: диапазон пикселей
  • добавляет padding и step

point scale

domain задаёт категории, range распределяет точки равномерно:

  • без ширины элементов
  • только позиции

авто-расчёт domain и переопределение

При наличии нескольких слоёв данных Vega-Lite может автоматически расширять domain для объединения значений. Однако явное задание domain отключает авторасширение.

Пример конфликтного поведения:

  • слой 1: [0, 10]
  • слой 2: [5, 20]

Авто domain: [0, 20]

Явный domain: [0, 10] или [5, 20] (в зависимости от задания)

нормализация данных

domain участвует в нормализации:

  • преобразование данных в диапазон [0,1]
  • последующее отображение в range

Это позволяет единообразно обрабатывать:

  • оси
  • цвета
  • размеры маркеров

особенности работы с time domain

Для временных данных domain принимает даты:

"scale": {
  "type": "time",
  "domain": ["2020-01-01", "2025-01-01"]
}

Значения интерпретируются как timestamps, а range преобразуется в пиксели по временной оси.

дискретизация и плотность отображения

Связка domain/range напрямую влияет на:

  • плотность точек
  • читаемость графика
  • распределение элементов

Слишком широкий domain при фиксированном range приводит к сжатию данных, слишком узкий — к потере контекста.

типичные ошибки при работе с domain и range

  • несоответствие типов (строки в числовой шкале)
  • domain без сортировки категорий
  • range меньшего размера, чем domain в ordinal шкалах
  • использование log scale с нулём или отрицательными значениями
  • конфликт автоматического и ручного domain

комбинирование нескольких шкал

При построении сложных визуализаций каждая шкала имеет собственные domain и range:

  • x-scale: domain по времени, range по ширине
  • y-scale: domain по значениям, range по высоте
  • color-scale: domain по категориям, range по палитре

Разделение domain и range по шкалам обеспечивает независимость измерений и предсказуемость визуального результата