Стековое кодирование в Vega и Vega-Lite применяется для преобразования наборов значений в накопительные (stacked) представления, где отдельные компоненты суммируются вдоль выбранной оси. Основная цель — показать вклад категорий в общий итог, сохраняя при этом информацию о структуре составляющих.
В терминах спецификации визуализации стекирование относится к этапу
преобразования данных, при котором исходные числовые значения заменяются
интервалами [y0, y1] или [x0, x1]. Эти
интервалы затем используются для построения областей, столбцов или
полос, расположенных друг над другом.
В Vega-Lite стекирование чаще всего управляется через свойство
stack внутри канала кодирования (encoding).
Оно применяется к количественным каналам, обычно x или
y, в сочетании с категориальным разбиением через
color, detail или column.
Основные режимы:
"zero" — стек начинается от нуля"center" — центрированное стековое
отображение (streamgraph)"normalize" — нормализация в проценты
(100% stacked)null / false —
стекирование отключеноТипичный сценарий — столбчатая диаграмма с накоплением:
{
"mark": "bar",
"encoding": {
"x": {"field": "month", "type": "ordinal"},
"y": {
"field": "value",
"type": "quantitative",
"stack": "zero"
},
"color": {"field": "category", "type": "nominal"}
}
}
В этом случае Vega-Lite автоматически:
x и colory0 и y1Результатом становится набор прямоугольников, расположенных друг над другом.
При включении стекового режима Vega-Lite фактически переписывает данные. Каждое значение преобразуется в диапазон:
y0 — нижняя граница сегментаy1 — верхняя граница сегментаПример логики:
category A: y0 = 0, y1 = 10
category B: y0 = 10, y1 = 25
category C: y0 = 25, y1 = 40
Эта трансформация критична для mark-типов:
bararearectХотя чаще используется вертикальное накопление, стекирование возможно и по горизонтали:
{
"mark": "bar",
"encoding": {
"x": {
"field": "value",
"type": "quantitative",
"stack": "zero"
},
"y": {"field": "group", "type": "nominal"},
"color": {"field": "segment"}
}
}
Здесь сумма строится вдоль оси X, что меняет визуальную интерпретацию: вместо вертикального накопления создаются горизонтальные сегменты.
Режим "normalize" преобразует абсолютные значения в доли
от общего итога внутри группы.
Формально:
y' = y / sum(y_group)
Пример:
{
"mark": "bar",
"encoding": {
"x": {"field": "year", "type": "ordinal"},
"y": {
"field": "sales",
"type": "quantitative",
"stack": "normalize"
},
"color": {"field": "product"}
}
}
Такой режим используется для сравнения структуры распределений между группами при различающихся абсолютных масштабах.
"center" смещает стек относительно центральной линии,
создавая симметричную композицию:
▲
____│____
/ │ \
/ │ \
Внутренне значения центрируются относительно нуля:
y0 = cumulative - total/2
y1 = y0 + value
Этот режим часто применяется для потоковых диаграмм (streamgraph), где важна динамика вкладов во времени.
Если стекирование не требуется, используется:
"stack": null
или:
"stack": false
В этом случае значения интерпретируются как независимые, и элементы могут перекрывать друг друга или отображаться рядом в зависимости от mark-типа и других настроек.
Vega-Lite способен включать стекирование неявно, даже если
stack не задан явно. Это происходит при выполнении
условий:
quantitative)color, detail или
facetВ таких случаях поведение по умолчанию эквивалентно
"stack": "zero".
Стекирование может конфликтовать или комбинироваться с трансформациями данных:
При использовании агрегации (sum, count,
mean) стекирование выполняется после агрегации:
{
"aggregate": [{"op": "sum", "field": "value", "as": "total"}]
}
После этого применяется stack к total.
Для биннинга стекирование применяется к уже дискретизированным интервалам:
Вычисляемые поля не влияют на механику стекирования, но могут менять основу суммирования.
Помимо encoding-level stack, Vega предоставляет более
низкоуровневый transform:
{
"transform": [
{
"stack": "value",
"groupby": ["category"],
"sort": {"field": "value"},
"as": ["y0", "y1"]
}
]
}
Ключевые параметры:
Этот вариант используется, когда требуется полный контроль над процессом стекирования.
Порядок наложения категорий критически влияет на результат визуализации. Vega-Lite использует:
colorsort в encodingПример:
"color": {
"field": "type",
"sort": "ascending"
}
Неправильная сортировка может привести к визуально искажённым результатам, особенно в area charts.
Стекирование не применяется в следующих случаях:
linescale)Также важно учитывать:
При наличии отрицательных данных стек разделяется:
positive stack → вверх
negative stack → вниз
Это реализуется через раздельное накопление сумм:
Такой подход предотвращает смешение направлений и сохраняет корректную геометрию диаграммы.
Алгоритм стекирования можно представить следующим образом:
x +
color)[y0, y1]Наиболее тесная интеграция наблюдается с:
Для area стекирование определяет форму многоуровневой поверхности, где каждая серия данных формирует слой.
Поле stack в Vega-Lite — это декларативный механизм
управления накопительными преобразованиями, который скрывает сложность
расчёта границ интервалов и предоставляет унифицированный способ
построения сложных многослойных визуализаций.