Поле band и binned в кодировании

В Vega-Lite и Vega визуальные элементы часто размещаются не в непрерывной числовой шкале, а внутри дискретных «полос» (bands), которые формируются шкалами типа band и point. Такие шкалы разбивают ось на равные сегменты, каждый из которых соответствует категориальному значению. Именно внутри этих сегментов и работает поле band в кодировании.

Ключевая идея band-модели заключается в том, что каждая категория получает не точку на оси, а область фиксированной ширины. Эта область называется bandwidth. Внутри неё можно позиционировать маркеры с точной настройкой смещения.

Логика band-координат

При использовании шкалы:

{
  "x": { "field": "category", "type": "ordinal", "scale": { "type": "band" } }
}

каждому значению category соответствует сегмент оси. Однако сам маркер может быть смещён внутри этого сегмента, и именно для этого используется bandPosition.

bandPosition как управление внутри сегмента

Поле bandPosition задаёт относительное положение элемента внутри band-ячейки. Оно принимает значения от 0 до 1:

  • 0 — левый (или верхний) край band
  • 0.5 — центр band
  • 1 — правый (или нижний) край band

Пример:

{
  "mark": "circle",
  "encoding": {
    "x": {
      "field": "category",
      "type": "ordinal",
      "scale": { "type": "band" },
      "bandPosition": 0.5
    },
    "y": { "field": "value", "type": "quantitative" }
  }
}

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

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

Связь band и bandWidth

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

  • x — начало категории
  • x2 — конец категории
  • bandwidth — ширина сегмента

При этом bandPosition позволяет перейти от «границ категории» к внутреннему позиционированию маркера, не теряя связи с категорией.

Использование band в сложных композициях

В многослойных графиках band-позиционирование часто применяется для:

  • смещения нескольких рядов точек внутри одной категории
  • построения grouped bar charts
  • создания jitter-подобных эффектов без случайности
  • точного выравнивания аннотаций внутри категориальных полос

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

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

Концепция binned данных

Биннинг преобразует непрерывные значения в интервалы:

  • 0–10
  • 10–20
  • 20–30

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

Обычно Vega-Lite сам выполняет биннинг через:

{
  "bin": true,
  "field": "value"
}

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

{
  "field": "bin_start",
  "type": "quantitative",
  "bin": "binned"
}

или логически эквивалентное указание:

{
  "binned": true
}

Роль binned в интерпретации данных

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

  • x и x2 — начало и конец интервала по оси X
  • y и y2 — аналогично по оси Y

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

Пример гистограммы с предрассчитанными бинами

{
  "data": { "name": "table" },
  "mark": "bar",
  "encoding": {
    "x": {
      "field": "bin_start",
      "type": "quantitative",
      "bin": "binned"
    },
    "x2": { "field": "bin_end" },
    "y": { "field": "count", "type": "quantitative" }
  }
}

Здесь:

  • bin_start и bin_end задают границы интервала
  • binned сообщает, что данные уже агрегированы
  • Vega-Lite не применяет дополнительный bin-transform

Отличие binned от bin transform

Важно различать два уровня обработки:

  1. bin transform (автоматический биннинг)

    • выполняется внутри Vega-Lite
    • вход: сырые данные
    • выход: новые поля (bin_start, bin_end, count)
  2. binned encoding (уже готовые бины)

    • данные подготовлены заранее
    • Vega-Lite не выполняет трансформацию
    • используется только интерпретация диапазонов

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

При binned данные:

  • не интерпретируются как отдельные точки
  • требуют использования диапазонных каналов (x + x2, y + y2)
  • часто отключают привычные интервальные преобразования оси

Это важно для:

  • серверной агрегации данных
  • работы с большими наборами данных
  • интеграции с SQL/OLAP системами, где биннинг выполняется на стороне базы

Комбинация band и binned в визуализациях

Несмотря на различие семантики, band и binned могут пересекаться в одном графике:

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

Типичный сценарий:

  • ось X — категориальная (band scale)
  • ось Y — интервалы значений (binned histogram)

Такая комбинация используется в:

  • распределениях по категориям
  • stacked histogram-like визуализациях
  • анализе плотности внутри категорий

Особенности интерпретации в движке Vega

Внутренний движок Vega обрабатывает binned как флаг семантического типа данных. Это влияет на:

  • выбор mark-рендеринга (rect vs point)
  • построение scale domains
  • автоматическую генерацию axis ticks

В отличие от bandPosition, который работает на уровне геометрии, binned работает на уровне структуры данных и трансформаций.