Поле scale в кодировании

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

Формально шкала описывает отображение:

domain (данные) → range (визуальные значения)

В декларативной модели Vega-Lite шкала является частью канала кодирования (encoding) и задаёт локальные или модифицированные параметры преобразования.


Встраивание scale в канал кодирования

Шкала задаётся внутри конкретного канала:

{
  "mark": "point",
  "encoding": {
    "x": {
      "field": "price",
      "type": "quantitative",
      "scale": {
        "type": "linear",
        "zero": false
      }
    }
  }
}

Если scale не задан явно, Vega-Lite автоматически выбирает тип шкалы на основе type поля данных (quantitative, temporal, ordinal).


Типы шкал

Линейная шкала

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

"scale": {
  "type": "linear"
}

Характеристика: равномерное отображение изменений значений.


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

Подходит для экспоненциально растущих данных.

"scale": {
  "type": "log"
}

Особенность: требует положительных значений.


Степенная шкала

"scale": {
  "type": "pow",
  "exponent": 0.5
}

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


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

Для дискретных значений:

  • ordinal
  • band
  • point
"scale": {
  "type": "band",
  "padding": 0.2
}

band распределяет категории по отрезкам, point — по точкам.


Временные шкалы

"scale": {
  "type": "time"
}

Поддерживает календарную семантику и неравномерные интервалы.


Ключевые параметры scale

domain — область входных значений

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

Автоматический режим:

"domain": true

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

"domain": [0, 100]

Или привязка к данным:

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

range — область отображения

Определяет визуальный диапазон:

"range": [0, 400]

Для цветов:

"range": ["#f00", "#00f"]

nice — округление границ

"scale": {
  "type": "linear",
  "nice": true
}

Автоматически расширяет domain до «красивых» значений (например, 97 → 100).


zero — включение нулевой точки

"scale": {
  "zero": true
}

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


clamp — ограничение значений

"scale": {
  "clamp": true
}

Все значения вне domain «прижимаются» к границам шкалы.


reverse — инверсия шкалы

"scale": {
  "reverse": true
}

Меняет направление отображения (например, высокий → низкий).


Масштабирование в разных каналах

Ось X и Y

Наиболее частое использование:

"encoding": {
  "x": {
    "field": "sales",
    "type": "quantitative",
    "scale": { "type": "linear" }
  },
  "y": {
    "field": "month",
    "type": "ordinal",
    "scale": { "type": "band" }
  }
}

Цвет (color)

Цветовые шкалы являются отдельным классом преобразований:

"color": {
  "field": "temperature",
  "type": "quantitative",
  "scale": {
    "scheme": "redyellowblue"
  }
}

Цветовые схемы (scheme)

Vega-Lite поддерживает предустановленные градиенты:

  • blues
  • reds
  • viridis
  • magma
  • category10

Пример:

"scale": {
  "scheme": "viridis"
}

Для дискретных данных:

"scale": {
  "scheme": "category10"
}

Категориальные шкалы band и point

band

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

"scale": {
  "type": "band",
  "padding": 0.1
}

Характеристика: каждая категория занимает интервал.


point

Категории отображаются как точки без ширины:

"scale": {
  "type": "point"
}

Используется в scatter-like представлениях категорий.


Отключение масштабирования

Иногда требуется передать значение напрямую без преобразования:

"encoding": {
  "x": {
    "field": "x",
    "scale": null
  }
}

Это приводит к использованию «сырых» значений.


Наследование и автоматические шкалы

Если scale не задан, Vega-Lite автоматически:

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

Пример поведения:

  • quantitative → linear
  • temporal → time
  • ordinal → band/point
  • nominal → categorical color or band

Композиция шкал и повторное использование

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


Масштабирование и агрегации

Шкала может строиться по агрегированным данным:

"x": {
  "aggregate": "sum",
  "field": "value",
  "type": "quantitative",
  "scale": {
    "type": "linear"
  }
}

В этом случае domain вычисляется уже после агрегации.


Поведение при биннинге

При использовании bin: true шкала автоматически адаптируется к интервальным значениям:

"x": {
  "bin": true,
  "field": "age",
  "type": "quantitative",
  "scale": {
    "type": "linear"
  }
}

Domain становится набором интервалов, а не точечных значений.


Влияние scale на интерпретацию визуализации

Шкала определяет:

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

Неправильный выбор типа шкалы приводит к искажению восприятия данных, особенно при переходе между linear и log.


Связь scale с осью и легендой

Шкала одновременно управляет:

  • осью (axis)
  • легендой (legend)
  • интерпретацией маркеров

Любое изменение scale автоматически отражается во всех связанных визуальных элементах, так как они используют единое преобразование domain → range.


Пример комплексной конфигурации

{
  "mark": "bar",
  "encoding": {
    "x": {
      "field": "category",
      "type": "ordinal",
      "scale": {
        "type": "band",
        "padding": 0.15
      }
    },
    "y": {
      "field": "value",
      "type": "quantitative",
      "scale": {
        "type": "linear",
        "zero": true,
        "nice": true
      }
    },
    "color": {
      "field": "group",
      "type": "nominal",
      "scale": {
        "scheme": "category10"
      }
    }
  }
}