stack: явное управление стекированием

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


Базовый принцип стековой агрегации

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

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

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

Без стека каждая серия отображается независимо. Со стеком значения суммируются по оси, образуя слоистую структуру.


Автоматическое стекование в Vega-Lite

Во многих случаях Vega-Lite включает стекирование автоматически, если:

  • используется mark: "bar" или mark: "area"
  • задано несколько группирующих полей через color, detail или column
  • отсутствует явный запрет на стек

Пример логики:

  • x — категория
  • y — числовое значение
  • color — серия

В этом случае Vega-Lite интерпретирует данные как кандидата на стековую визуализацию.


Явное управление стеком через параметр stack

Ключевым механизмом управления является свойство:

  • stack

Оно может принимать несколько значений:

  • "zero" — стандартное стекование от нуля
  • "center" — центрированное стекование (streamgraph)
  • null — отключение стекования

stack: “zero” — классическое стекование

Стекирование от нулевой линии является наиболее распространённым вариантом. Оно формирует привычные stacked bar chart и stacked area chart.

Поведение:

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

Характерные свойства:

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

stack: “center” — центрированное стекование

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

Механизм:

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

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

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

stack: null — отключение стекования

Явное отключение стекования используется, когда:

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

При stack: null:

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

Пример структуры с явным stack

{
  "mark": "bar",
  "encoding": {
    "x": { "field": "month", "type": "ordinal" },
    "y": {
      "field": "value",
      "type": "quantitative",
      "stack": "zero"
    },
    "color": { "field": "category" }
  }
}

В этом примере стекование явно закреплено за осью y, что определяет поведение всей диаграммы.


Стекование по разным осям

Vega-Lite позволяет управлять тем, какая ось участвует в стековании. Это определяется положением stack внутри encoding канала:

  • для вертикальных bar charts стек применяется к y
  • для горизонтальных — к x
  • для area charts стекование влияет на форму полигона

Логика зависит от ориентации:

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

Роль сортировки в стековании

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

Если не задан order, Vega-Lite использует:

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

Явное управление осуществляется через:

  • sort внутри encoding
  • или отдельное поле order

Неправильный порядок может привести к искажению интерпретации, особенно при использовании stack: "center".


Стекирование и агрегирование

Стекирование тесно связано с агрегацией данных.

Типичная комбинация:

  • aggregate: "sum"
  • groupby через x и color

При этом стекирование работает поверх уже агрегированных значений.

Важно различать:

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

Поведение при отрицательных значениях

При наличии отрицательных чисел стекование становится неоднозначным.

Vega-Lite обрабатывает это следующим образом:

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

При этом:

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

Управление стеком в area charts

Для mark: "area" стекирование играет особую роль.

При stack: "zero":

  • формируется классический stacked area chart
  • каждый слой представляет вклад в общую площадь

При stack: "center":

  • формируется streamgraph
  • визуальный эффект «потока»

При stack: null:

  • области перекрываются
  • возможна потеря читаемости

Поведение с facet и stack

При использовании фасетирования (facet) стекование применяется отдельно в каждой панели.

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

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

Это важно для корректного сравнения групп.


Влияние масштабирования (scale)

Стекирование тесно связано с масштабом осей.

При stack: "zero":

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

При stack: null:

  • шкала отражает только максимальное индивидуальное значение

Это влияет на:

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

Практическое управление поведением stack

Явное управление стеком применяется для предотвращения автоматических решений Vega-Lite.

Ключевые сценарии:

  • отключение нежелательного стекования при множественных сериях
  • принудительное включение для унификации графиков
  • переключение между аналитическими режимами (zero vs center)

Взаимодействие stack с transform pipeline

Стекирование происходит после этапа трансформаций данных:

  1. filter
  2. aggregate
  3. bin
  4. calculate
  5. stack

Это означает:

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

Ограничения и поведение по умолчанию

Vega-Lite применяет стекование только при определённых условиях:

  • наличие группирующего поля
  • совместимость mark type
  • отсутствие конфликтующих encoding настроек

Если условия не выполняются:

  • стек игнорируется
  • данные отображаются как независимые серии