Vega и Vega-Lite используют иерархическую модель визуализации, в которой композиционные элементы строятся через группы (group marks). Каждая группа представляет собой отдельную систему координат, контейнер для вложенных примитивов и логическую границу, внутри которой применяются трансформации, масштабирование и стилизация.
Группа в Vega-экосистеме — это не просто контейнер, а полноценный визуальный слой, обладающий собственной локальной системой координат. Внутри группы могут находиться:
Группы позволяют строить сложные композиции: фасетированные графики, small multiples, вложенные диаграммы, интерактивные панели.
Ключевое свойство группы — возможность ограничивать область отображения дочерних элементов. Именно здесь появляется поле clip.
Поле clip определяет, будут ли визуальные элементы внутри группы обрезаться по границам этой группы.
Базовая идея:
clip управляет тем, может ли содержимое группы выходить за её визуальные границы.
Если clipping включён, любые примитивы, выходящие за пределы прямоугольника группы, визуально обрезаются. Если отключён — элементы могут свободно «переползать» за границы контейнера.
В Vega поле clip задаётся внутри определения group
mark:
{
"type": "group",
"clip": true,
"marks": [
{
"type": "rect",
"encode": {
"enter": {
"x": {"value": -20},
"y": {"value": -20},
"width": {"value": 200},
"height": {"value": 200},
"fill": {"value": "steelblue"}
}
}
}
]
}
При clip: true все дочерние marks ограничиваются
прямоугольником группы. При clip: false тот же
прямоугольник может визуально выходить за пределы контейнера.
В Vega-Lite clipping чаще всего управляется на уровне view composition и facet/groupby-конструкций, а также через трансляцию в Vega group marks.
Типичная форма:
{
"data": {"url": "data.csv"},
"mark": "area",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"}
},
"clip": true
}
На уровне компиляции Vega-Lite превращает это в соответствующую
структуру Vega, где clip становится свойством group mark
или layer container.
Каждая группа в Vega имеет собственный bounding box, вычисляемый из:
Поле clip фактически включает или отключает применение
операции пересечения:
визуальный пиксель отображается только если он попадает внутрь прямоугольника группы.
Можно формализовать:
visible_pixel = pixel ∩ group_bounds
при clip = true.
Вложенные группы наследуют поведение clipping, но могут переопределять его локально.
Пример структуры:
{
"type": "group",
"clip": true,
"marks": [
{
"type": "group",
"clip": false,
"marks": [
{
"type": "rect"
}
]
}
]
}
Здесь внутренний group может «выпасть» за границы родителя, если
собственный clip отключён, однако итоговое поведение
зависит от композитного контекста рендера: в большинстве случаев
родительский clip имеет приоритет как верхнеуровневое ограничение.
Группы часто содержат оси и сетки. В таких случаях clipping критичен для предотвращения визуального «размазывания» элементов:
Типичная схема:
group (clip: true)
├── axis
├── gridlines
├── marks (bars/lines)
Основной кейс — построение диаграмм, где элементы не должны выходить за plot area.
{
"type": "group",
"clip": true,
"encode": {
"enter": {
"width": {"value": 300},
"height": {"value": 200}
}
},
"marks": [
{
"type": "line"
}
]
}
При построении решёток графиков clipping предотвращает визуальные пересечения между ячейками.
{
"facet": {
"row": {"field": "category"}
},
"spec": {
"mark": "bar",
"clip": true
}
}
При масштабировании (zoom/pan) clipping предотвращает выход геометрии за viewport.
Особенно важно при:
Transform pipeline (filter, aggregate, calculate, scale) не влияет напрямую на clip, но влияет на координаты, которые уже проверяются на этапе рендеринга.
Особое поведение наблюдается при:
Включение clipping может влиять на производительность рендеринга.
Положительные эффекты:
Отрицательные эффекты:
Vega поддерживает разные бэкенды рендеринга:
В SVG clipping реализуется через clipPath, который
создаётся автоматически для групп с clip: true.
В Canvas clipping реализуется через контекстный
ctx.clip().
Разница проявляется в:
clip не всегда ведёт себя как обычное CSS-наследование. В Vega модель более структурная:
При включённом clip элементы могут исчезать при zoom-out или изменении масштаба.
Если padding группы не учтён, подписи могут обрезаться:
Tooltip или hover-элементы могут быть случайно обрезаны группой.
clip — это не просто ограничитель, а механизм построения модульных визуализаций. Он позволяет:
В сложных визуализациях именно комбинация групп и clip формирует основу архитектуры сцены в Vega и Vega-Lite.