Механизм selection в Vega-Lite представляет собой декларативный способ описания интерактивности визуализаций через выбор подмножеств данных. Вместо императивного управления событиями и DOM-логикой задаётся декларация: какие данные считаются выбранными, как формируется выбор и как он влияет на отображение.
Вся система selection строится вокруг двух базовых типов: point selection и interval selection. Эти два подхода покрывают большинство сценариев интерактивного анализа данных — от выделения отдельных наблюдений до работы с диапазонами значений.
В Vega-Lite selection определяется как именованный объект внутри
секции selection, который:
Пример общей структуры:
{
"selection": {
"sel": {
"type": "point",
"fields": ["category"],
"toggle": "event.shiftKey"
}
}
}
Сформированное состояние selection затем может использоваться в
encoding через условные выражения
(condition).
Point selection предназначен для выбора отдельных точек данных (или групп точек), соответствующих конкретным значениям.
Point selection оперирует дискретными объектами:
fields){
"selection": {
"picked": {
"type": "point",
"on": "click"
}
}
}
Point selection часто применяется для:
Пример условного окрашивания:
{
"mark": "circle",
"selection": {
"sel": { "type": "point" }
},
"encoding": {
"color": {
"condition": {
"selection": "sel",
"value": "red"
},
"value": "gray"
}
}
}
Ограничивает выбор конкретными полями данных.
"fields": ["country"]
Если не указано — selection работает по всему объекту данных.
Управляет поведением множественного выбора.
true — добавление/удаление элементов
(multi-select)false — замена выбора"event.shiftKey" — условное поведение через
клавишиПозволяет выбирать ближайшую точку к курсору.
Особенно полезно в плотных scatter plot.
"nearest": true
Определяет событие сброса selection.
"clear": "dblclick"
Interval selection используется для выделения диапазона значений по одной или нескольким осям.
Физически реализуется через brush-интерфейс: пользователь тянет прямоугольник, формируя область выбора.
{
"selection": {
"brush": {
"type": "interval"
}
}
}
Interval selection создаёт двумерный или одномерный диапазон:
Выбранные данные интерпретируются как:
все точки, попадающие в заданный диапазон координат
{
"selection": {
"brush": {
"type": "interval"
}
},
"mark": "point",
"encoding": {
"x": { "field": "time", "type": "temporal" },
"y": { "field": "value", "type": "quantitative" }
}
}
Ограничивает оси, по которым можно выделять диапазон.
"encodings": ["x"]
Это превращает brush в горизонтальный слайдер.
Позволяет стилизовать область выделения:
"mark": {
"fill": "#blue",
"fillOpacity": 0.2,
"stroke": "black"
}
Позволяет перемещать уже выделенный интервал.
"translate": true
Связывает selection с масштабированием (zooming):
"zoom": true
Это превращает brush в инструмент навигации по данным.
Point selection лучше подходит для:
Interval selection лучше подходит для:
В сложных визуализациях point и interval selection часто используются одновременно.
Пример:
"selection": {
"brush": { "type": "interval" },
"highlight": { "type": "point" }
}
Selection может применяться как динамический фильтр данных через
transform.
"transform": [
{
"filter": { "selection": "brush" }
}
]
Это позволяет:
Selection тесно интегрируется с каналами визуализации:
opacitycolorsizestrokeWidthПример затемнения невыбранных элементов:
"opacity": {
"condition": {
"selection": "sel",
"value": 1
},
"value": 0.2
}
Система позволяет объявлять несколько независимых selection:
"selection": {
"brush": { "type": "interval" },
"focus": { "type": "point" }
}
Каждый selection имеет собственное состояние и может использоваться независимо.
Point selection и interval selection поддерживают разные модели событий:
Эти события декларативно задаются через on.
Point selection:
Interval selection:
Внутри Vega-Lite selection компилируется в:
Это означает, что selection не является «надстройкой», а частью реактивного графа исполнения.