Фасетинг в Vega-Lite реализуется как механизм разбиения одного набора
данных на множественные подграфики (small multiples), где каждый
подграфик соответствует подмножеству данных, определённому значением
одного или нескольких полей. В контексте encoding-каналов
row и column фасетинг превращает плоскую
визуализацию в двумерную сетку графиков, сохраняя единый шаблон
отображения и обеспечивая сравнение распределений между категориями.
В Vega-Lite фасетинг через row и column
задаётся внутри блока encoding. Каждый из этих каналов
определяет дискретное поле, по значениям которого данные разбиваются на
отдельные панели.
Ключевая идея заключается в том, что:
row управляет вертикальным разбиением (каждое значение
создаёт отдельную строку графиков)column управляет горизонтальным разбиением (каждое
значение создаёт отдельный столбец графиков)Комбинация этих двух каналов формирует матрицу визуализаций.
Пример базовой структуры:
{
"data": { "url": "data.csv" },
"mark": "bar",
"encoding": {
"x": { "field": "category", "type": "nominal" },
"y": { "field": "value", "type": "quantitative" },
"row": { "field": "region", "type": "nominal" },
"column": { "field": "year", "type": "nominal" }
}
}
В данной конфигурации создаётся сетка, где каждая ячейка
соответствует комбинации region × year, а внутри каждой
ячейки строится одинаковый столбчатый график.
При использовании row и column Vega-Lite
выполняет группировку данных по соответствующим полям. Это можно
рассматривать как автоматическое применение операции GROUP BY перед
отрисовкой:
rowcolumnВажно, что каждая панель получает свой независимый масштаб осей, если не указано иное. Это позволяет сравнивать формы распределений, но требует осторожности при интерпретации абсолютных значений.
Канал фасетинга наиболее естественно работает с дискретными
(nominal, ordinal) данными. В этом случае
каждая категория становится отдельной панелью.
При использовании непрерывных полей (quantitative)
Vega-Lite автоматически выполняет биннинг или требует явного
преобразования:
{
"encoding": {
"row": {
"field": "age",
"bin": true,
"type": "quantitative"
}
}
}
Биннинг приводит к тому, что числовой диапазон превращается в набор интервалов, каждый из которых становится отдельной строкой или колонкой фасетной сетки.
Фасетинг может применяться как до, так и после агрегации данных. Важно различать два сценария:
Каждая точка данных попадает в соответствующую панель, и внутри панели возможна дополнительная агрегация через encoding:
{
"mark": "bar",
"encoding": {
"row": { "field": "country", "type": "nominal" },
"x": { "field": "category", "type": "nominal" },
"y": {
"aggregate": "mean",
"field": "value",
"type": "quantitative"
}
}
}
Здесь каждая панель показывает среднее значение по категориям внутри страны.
Если используется явная агрегация на уровне transform, фасетинг работает уже с предварительно агрегированным набором данных. Это уменьшает нагрузку и упрощает визуальную структуру.
Порядок отображения панелей в row и column
определяется сортировкой значений. Vega-Lite предоставляет управление
через sort:
{
"row": {
"field": "region",
"type": "nominal",
"sort": ["Asia", "Europe", "America"]
}
}
Сортировка влияет не только на визуальный порядок, но и на восприятие
структуры данных. При отсутствии явного sort используется
лексикографический или внутренний порядок кодирования.
Одной из ключевых особенностей фасетинга является управление шкалами:
independent scales)resolveПример глобального связывания шкал:
{
"resolve": {
"scale": {
"y": "shared"
}
}
}
В этом случае все панели используют единую шкалу Y, что критично для корректного сравнения абсолютных значений.
row и column могут использоваться
одновременно с другими формами фасетирования, включая facet
как отдельный оператор. Однако при использовании encoding-каналов
создаётся именно табличная структура.
Вложенность проявляется через иерархию разбиений:
rowcolumnЭто создаёт визуальную структуру, эквивалентную двумерной матрице группировок.
Каждая панель автоматически получает заголовок (header), основанный на значении поля фасетирования. Vega-Lite позволяет управлять стилем и расположением этих заголовков:
{
"row": {
"field": "region",
"type": "nominal",
"header": {
"labelAngle": 0,
"labelAlign": "left"
}
}
}
Заголовки играют роль контекстных меток, заменяя необходимость повторного отображения легенды внутри каждой панели.
При увеличении числа уникальных значений в row или
column визуализация начинает терять читаемость. Vega-Lite
не ограничивает число панелей, но практическая эффективность зависит
от:
При большом числе категорий используется стратегия перехода к фильтрации или интерактивной селекции вместо полного фасетинга.
Фасетинг через encoding совместим с большинством mark-типов:
bar — сравнение агрегатов по категориямline — временные тренды внутри группpoint — распределения и корреляцииarea — накопительные представленияПри использовании line особенно важно учитывать
сортировку по оси времени внутри каждой панели, так как каждая фасета
строит независимую траекторию.
{
"mark": "line",
"encoding": {
"row": { "field": "country", "type": "nominal" },
"x": { "field": "date", "type": "temporal" },
"y": { "field": "value", "type": "quantitative" }
}
}
Хотя row и column реализуют фасетинг, в
Vega-Lite существует отдельный оператор facet, который
работает на уровне композиции.
Различие заключается в следующем:
row/column применяет фасетинг как часть
визуального encodе слояfacet создаёт независимые под-визуализации как
композиционные единицыEncoding-подход проще и чаще используется для стандартных
grid-визуализаций, тогда как facet даёт больше контроля над
вложенными структурами и повторным использованием спецификаций.
Легенды в фасетной сетке ведут себя как глобальные элементы:
resolve.legendЭто предотвращает визуальный шум при большом числе панелей.
Фасетинг увеличивает число рендеримых графических объектов линейно по
числу комбинаций row × column. При больших датасетах
применяются следующие оптимизации:
line к
point)Vega-Lite выполняет трансформации декларативно, но итоговая нагрузка зависит от размера итоговой структуры панелей.
Фасетирование через row и column особенно
эффективно для задач сравнительного анализа:
Каждая панель становится изолированной аналитической единицей, при этом сохраняется единый визуальный язык всей композиции.
Хотя encoding-фасетинг сам по себе статичен, он часто используется совместно с интерактивными элементами Vega-Lite:
В таких сценариях каждая фасета становится участником общей интерактивной модели, где выделение в одной панели может влиять на другие через сигналы и параметры.