Поле clip в Vega-Lite управляет отображением графических
элементов за пределами области построения (plot area). При
включённой обрезке все элементы, выходящие за рамки координатной
системы, становятся невидимыми.
По умолчанию большинство графических объектов в Vega-Lite могут выходить за пределы области графика. Это удобно для подписей, аннотаций и визуальных акцентов, однако в ряде случаев требуется строгое ограничение отображения.
Поле clip решает именно эту задачу.
clipОбрезка используется в нескольких типичных ситуациях:
Особенно важно использование clip при:
calculate и window;{
"mark": {
"type": "line",
"clip": true
}
}
Поле принимает булево значение:
| Значение | Описание |
|---|---|
true |
графика обрезается по области построения |
false |
элементы могут выходить за границы |
Область построения определяется:
scale);width и height;Если элемент визуально оказывается вне этой области, Vega-Lite скрывает его часть.
Например:
{
"mark": {
"type": "point",
"clip": true
}
}
Точки, координаты которых выходят за диапазон осей, не будут отображены.
clip{
"data": {
"values": [
{"x": 0, "y": 10},
{"x": 1, "y": 50},
{"x": 2, "y": 120}
]
},
"mark": "line",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {
"field": "y",
"type": "quantitative",
"scale": {
"domain": [0, 100]
}
}
}
}
Последняя точка имеет значение 120, которое выходит за
верхнюю границу шкалы (100).
Без clip линия может визуально продолжиться за пределы
графика.
clip{
"data": {
"values": [
{"x": 0, "y": 10},
{"x": 1, "y": 50},
{"x": 2, "y": 120}
]
},
"mark": {
"type": "line",
"clip": true
},
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {
"field": "y",
"type": "quantitative",
"scale": {
"domain": [0, 100]
}
}
}
}
Теперь сегмент линии выше 100 будет скрыт.
{
"mark": "point"
}
Точки большого размера могут частично выходить за пределы координатной области.
{
"mark": {
"type": "point",
"clip": true
}
}
Теперь видимой остаётся только часть внутри области построения.
Особенно заметно действие clip при использовании крупных
символов.
{
"mark": {
"type": "circle",
"size": 2000,
"clip": true
}
}
Без обрезки круги могут перекрывать:
С clip отображается только внутренняя часть.
clip и линииДля линейных графиков поле используется особенно часто.
При интерполяции:
{
"mark": {
"type": "line",
"interpolate": "basis"
}
}
сглаженная линия может выходить за область графика даже тогда, когда сами точки лежат внутри диапазона.
{
"mark": {
"type": "line",
"interpolate": "basis",
"clip": true
}
}
clip и area chartПлощадные графики (area) нередко создают выходы за
пределы шкалы.
{
"mark": {
"type": "area",
"clip": true
}
}
Это особенно важно при:
trailТип trail отображает линии переменной толщины.
{
"mark": {
"type": "trail",
"clip": true
}
}
Без обрезки толстые сегменты могут выходить за пределы графика.
clip и
геометрические примитивыПоле поддерживается многими mark-типами:
| Mark | Поддержка |
|---|---|
line |
да |
area |
да |
point |
да |
circle |
да |
square |
да |
trail |
да |
rect |
да |
rule |
да |
bar |
частично зависит от ситуации |
ruleЛинии типа rule часто используются для:
{
"mark": {
"type": "rule",
"clip": true
}
}
Это предотвращает выход направляющих линий за пределы графика.
clip может:
В SVG режимах обрезка реализуется через clipPath.
В Canvas используется ограничение области рисования.
clip от
фильтрации данныхВажно понимать разницу.
clipСкрывает графику визуально.
Данные остаются в наборе данных.
filterУдаляет записи до этапа рендеринга.
{
"transform": [
{
"filter": "datum.y <= 100"
}
]
}
filter и clipЧасто оба механизма используются одновременно:
{
"transform": [
{
"filter": "datum.y >= 0"
}
],
"mark": {
"type": "line",
"clip": true
}
}
clip при
интерактивном масштабированииПри использовании selection и
bind: "scales" обрезка становится особенно полезной.
{
"params": [
{
"name": "zoom",
"select": "interval",
"bind": "scales"
}
]
}
Во время масштабирования некоторые элементы временно могут выходить за область отображения.
clip: true предотвращает визуальные артефакты.
В многослойных графиках каждый слой может иметь собственную настройку
clip.
{
"layer": [
{
"mark": {
"type": "line",
"clip": true
}
},
{
"mark": {
"type": "text",
"clip": false
}
}
]
}
Это позволяет:
Распространённый подход:
| Элемент | clip |
|---|---|
| графические данные | true |
| текст и аннотации | false |
Это создаёт аккуратную визуализацию без потери информативности.
Для text-mark использование clip
встречается редко.
Причина:
Тем не менее:
{
"mark": {
"type": "text",
"clip": true
}
}
может быть полезно в dense visualization.
clip и анимацииВ интерактивных системах на Vega:
обрезка предотвращает появление элементов вне графика во время переходов.
В Canvas-рендеринге Vega-Lite использует внутреннюю область clipping region.
Это означает:
В SVG создаётся элемент:
<clipPath>
после чего визуальный элемент получает ссылку:
clip-path="url(#clip)"
Это может влиять на:
clipПоле не является универсальным решением.
Если координаты вычислены ошибочно:
{
"calculate": "datum.y * 1000",
"as": "huge"
}
clip лишь скрывает проблему.
Даже при скрытии элементов шкалы могут учитывать данные.
Например:
{
"scale": {
"domain": "unaggregated"
}
}
clip и autosizeПри автоматическом изменении размеров:
{
"autosize": "fit"
}
обрезка может менять визуальное восприятие плотности графики.
Особенно это заметно при:
{
"data": {
"url": "data/stocks.csv"
},
"mark": {
"type": "line",
"clip": true
},
"encoding": {
"x": {
"field": "date",
"type": "temporal"
},
"y": {
"field": "price",
"type": "quantitative",
"scale": {
"domain": [0, 200]
}
}
}
}
При резких скачках цены линия не выйдет за пределы области.
{
"mark": {
"type": "circle",
"clip": true,
"size": 300
}
}
Крупные точки не будут перекрывать оси.
{
"layer": [
{
"mark": {
"type": "line",
"clip": true
}
},
{
"mark": {
"type": "text",
"clip": false
}
}
]
}
Линия ограничена координатной областью, а подписи остаются свободными.
clip
рекомендуется использоватьclip ничего не удаляет из набора данных.
Обрезка не заменяет настройку шкал.
clip при
smoothingСглаженные кривые часто выходят за пределы графика.
Слишком агрессивный clipping делает визуализацию трудночитаемой.
После компиляции Vega-Lite создаёт Vega-спецификацию, где clipping превращается в:
{
"clip": true
}
на уровне mark definition.
Далее Vega уже реализует механизм обрезки средствами renderer backend.
boundsИногда clip используется совместно с:
{
"bounds": "flush"
}
Это помогает создавать компактные визуализации с жёсткими границами.
При экспорте:
обрезка сохраняется.
Это особенно важно для:
В HTML/CSS аналогом является:
overflow: hidden;
Однако clip работает:
{
"clip": true
}
почти всегда полезно.
Использовать только при высокой плотности.
Обрезка предотвращает перекрытие соседних графиков.
clip уменьшает количество визуальных артефактов при
изменении масштаба и панорамировании.