Независимые и общие шкалы в слоях

Масштаб (scale) в визуализации представляет собой преобразование данных из исходного домена значений в диапазон пикселей, цветов или других визуальных параметров. В контексте слоёв именно поведение масштабов определяет, насколько согласованными или независимыми будут визуальные элементы разных графических слоёв.

В Vega-Lite слоистая композиция (layer) опирается на единый принцип: каждый слой может либо использовать общие шкалы, либо переопределять их локально через механизм разрешения (resolve). Это делает систему одновременно строгой и гибкой, позволяя строить как единые координатные пространства, так и комбинированные визуализации с различными шкалами.


Модель слоёв и наследование шкал

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

Базовое поведение

Если не указано иное, все слои:

  • используют одинаковые шкалы по осям x и y
  • делят общий домен (domain) для числовых и категориальных значений
  • синхронизируют визуальные преобразования данных

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


Общие шкалы: принцип и последствия

Общие шкалы означают, что все слои используют один и тот же объект scale для конкретного канала (например, x, y, color).

Основные свойства общих шкал:

  • единый домен значений
  • согласованная система координат
  • совместимость разных mark-типа (line, point, area)
  • отсутствие визуальных смещений между слоями

Пример общей шкалы по оси X и Y

{
  "data": { "url": "data.csv" },
  "layer": [
    {
      "mark": "line",
      "encoding": {
        "x": { "field": "time", "type": "temporal" },
        "y": { "field": "valueA", "type": "quantitative" }
      }
    },
    {
      "mark": "point",
      "encoding": {
        "x": { "field": "time", "type": "temporal" },
        "y": { "field": "valueA", "type": "quantitative" }
      }
    }
  ]
}

Оба слоя используют одинаковые шкалы времени и значений, что гарантирует точное совпадение точек и линии.


Разделение шкал: независимые масштабы

Независимые шкалы используются, когда разные слои не должны интерпретировать данные в одном масштабе. Это особенно важно при:

  • сравнении разных метрик с разными диапазонами
  • комбинировании разнородных данных
  • наложении вторичных измерений

В Vega-Lite независимость шкал задаётся через resolve.


Механизм resolve.scale

Ключевая конструкция управления шкалами в слоях:

"resolve": {
  "scale": {
    "x": "shared",
    "y": "independent"
  }
}

Возможные значения:

  • "shared" — общая шкала для всех слоёв
  • "independent" — отдельная шкала для каждого слоя

Поведение по умолчанию

  • x: shared
  • y: shared
  • color: shared (если применимо)

Независимые шкалы по оси Y

Частый сценарий — сравнение величин с разными диапазонами.

Пример: две метрики с разными масштабами

{
  "data": { "url": "data.csv" },
  "layer": [
    {
      "mark": "line",
      "encoding": {
        "x": { "field": "date", "type": "temporal" },
        "y": { "field": "temperature", "type": "quantitative" }
      }
    },
    {
      "mark": "line",
      "encoding": {
        "x": { "field": "date", "type": "temporal" },
        "y": { "field": "humidity", "type": "quantitative" }
      }
    }
  ],
  "resolve": {
    "scale": {
      "y": "independent"
    }
  }
}

Здесь каждая линия получает собственную шкалу Y, предотвращая искажение одной переменной из-за диапазона другой.


Независимые шкалы по цвету

Шкалы цвета особенно чувствительны к конфликтам доменов, особенно при наложении категориальных и количественных данных.

Сценарий конфликта:

  • один слой использует категориальную палитру
  • второй — непрерывную градиентную шкалу

Решение:

"resolve": {
  "scale": {
    "color": "independent"
  }
}

Это позволяет каждому слою иметь собственную цветовую интерпретацию.


Полностью независимые слои

Полная независимость достигается через отключение всех общих шкал:

"resolve": {
  "scale": {
    "x": "independent",
    "y": "independent",
    "color": "independent"
  }
}

Такой подход фактически превращает слои в несколько независимых графиков, совмещённых в одном холсте.


Сравнение shared и independent

Shared scales

  • единая система координат
  • корректное наложение marks
  • минимальная когнитивная нагрузка
  • подходит для одного типа данных

Independent scales

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

Domain и его влияние на слои

Домены шкал определяют, какие значения отображаются.

Shared domain

При общих шкалах домен формируется как объединение всех слоёв:

  • min = минимальное значение среди всех слоёв
  • max = максимальное значение среди всех слоёв

Independent domain

Каждый слой вычисляет домен отдельно, что приводит к:

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

Перекрытие шкал и визуальные артефакты

Неверный выбор между shared и independent может приводить к:

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

Особенно критично это для:

  • временных рядов
  • финансовых графиков
  • научных измерений

Смешанные модели шкал

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

"resolve": {
  "scale": {
    "x": "shared",
    "y": "independent",
    "color": "shared"
  }
}

Такой подход позволяет:

  • сохранить единый временной или категориальный контекст (x)
  • разделить числовые метрики (y)
  • унифицировать визуальную кодировку (color)

Связь с системой Vega

В Vega модель шкал реализована более низкоуровнево. Каждый scale — это отдельный объект с явным описанием:

  • domain
  • range
  • interpolation
  • transform

В Vega-Lite эти детали абстрагируются, а управление сводится к декларативному resolve.


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

Сравнение двух метрик

  • independent y scales
  • shared x scale

Наложение предсказания и факта

  • shared x/y
  • independent color (если разные модели окраски)

Комбинация разных единиц измерения

  • полностью independent scales

Ограничения модели независимых шкал

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

Практическая логика выбора шкал

Выбор между shared и independent определяется структурой данных:

  • единые единицы измерения → shared
  • разные метрики → independent
  • визуальное сравнение трендов → shared x + independent y
  • совмещение разных типов кодирования → selective resolve

Внутренняя компоновка шкал в слоях

При компиляции спецификации Vega-Lite происходит:

  • анализ encoding каждого слоя
  • построение графа шкал
  • определение конфликтов доменов
  • применение правил resolve
  • генерация финальных scale-объектов для Vega runtime

Поведение при конфликте типов шкал

Если один слой использует:

  • quantitative scale
  • другой categorical scale

и шкала объявлена как shared, система:

  • либо приводит данные к общему домену
  • либо создаёт конфликт, требующий явного resolve

Масштабирование и композиция marks

Разные mark-типы по-разному реагируют на шкалы:

  • line — чувствителен к непрерывности x/y
  • bar — зависит от базовой линии
  • area — требует строгой синхронизации y
  • point — устойчив к независимости шкал

Итоговые структурные принципы

  • шкалы определяют геометрию визуализации
  • слои наследуют или разделяют шкалы
  • resolve управляет границами совместного использования
  • shared усиливает согласованность
  • independent усиливает гибкость композиции