В экосистеме Vega и Vega-Lite selection представляет собой декларативный способ описания пользовательского выбора данных внутри визуализации. Это не просто обработка событий мыши или клавиатуры, а абстракция уровня модели данных, где взаимодействие рассматривается как трансформация состояния, влияющая на фильтрацию, стилизацию и вычисление производных значений.
Selection выступает связующим слоем между событиями интерфейса и декларативной спецификацией графика. Вместо императивного кода «при клике выделить точку» описывается правило: какое состояние считается выбранным, как оно обновляется и каким образом влияет на данные и визуальные каналы.
В основе лежит идея параметра состояния. Selection — это именованное состояние, которое может:
В Vega-Lite selection описывается в секции selection, а
затем применяется через:
transform (фильтрация данных),encoding (условное отображение),scale (динамическое масштабирование),condition (ветвление визуальных свойств).Point selection фиксирует отдельные значения данных.
"selection": {
"highlight": {
"type": "point",
"encodings": ["x", "y"],
"on": "click",
"toggle": true
}
}
Point selection используется для:
Ключевой механизм — сопоставление событий с точными значениями полей данных.
Interval selection формирует диапазон значений, чаще всего через прямоугольное выделение мышью.
"selection": {
"brush": {
"type": "interval",
"encodings": ["x", "y"]
}
}
Interval selection применяется для:
Внутренне это представляется как набор границ по шкалам.
Позволяет накапливать несколько выбранных значений.
"selection": {
"cats": {
"type": "multi",
"fields": ["category"],
"toggle": "event.shiftKey"
}
}
Multi selection формирует множество активных значений, где каждое новое событие добавляет или удаляет элемент.
Selection напрямую интегрируется в поток данных через трансформации.
"transform": [
{
"filter": {
"selection": "brush"
}
}
]
Фильтрация работает как предикат: каждая строка данных проверяется на принадлежность выбранному диапазону или множеству.
Внутренне это эквивалентно вычислению логического выражения:
Одно из ключевых применений selection — условное оформление элементов.
"mark": "circle",
"encoding": {
"color": {
"condition": {
"selection": "highlight",
"value": "red"
},
"value": "lightgray"
}
}
Здесь selection становится переключателем визуального состояния.
Модель поведения:
Это превращает selection в декларативный state machine для визуальных свойств.
Selection может управлять масштабами осей.
"selection": {
"zoom": {
"type": "interval",
"bind": "scales"
}
}
При таком связывании:
Это один из наиболее мощных механизмов, так как selection перестаёт быть только фильтром и становится инструментом управления системой координат.
Selection описывает не только состояние, но и триггеры его обновления:
on: событие (click, drag, mouseover),clear: событие сброса,toggle: логика переключения,resolve: поведение при конфликте нескольких
selection.Пример:
"selection": {
"sel": {
"type": "point",
"on": "mouseover",
"clear": "mouseout"
}
}
Модель событий абстрагируется от DOM и описывается как декларативный поток.
Когда в визуализации существует несколько selection, возникает необходимость определения их взаимодействия:
union — объединение условий,intersect — пересечение,global — глобальное состояние,independent — независимые области."selection": {
"a": {"type": "point"},
"b": {"type": "interval"},
"resolve": "intersect"
}
Это определяет, как комбинируются предикаты выборки.
В Vega selection реализуется через signals и event streams. Вместо декларативного блока используется комбинация:
Пример сигнальной модели:
"signals": [
{
"name": "brush",
"on": [
{
"events": "@canvas:mousedown",
"update": "[eventX(), eventY()]"
}
]
}
]
Здесь selection фактически становится производной сигналов, а логика выделения описывается через поток событий.
Selection в Vega часто превращается в предикаты:
in — принадлежность значению,range — попадание в интервал,and/or/not — логические операции.Эти предикаты используются в фильтрах и выражениях:
"transform": [
{
"filter": "datum.value > brush[0] && datum.value < brush[1]"
}
]
Toggle-механизм определяет, как selection изменяется при повторных взаимодействиях:
"selection": {
"sel": {
"type": "point",
"toggle": true
}
}
Такой режим критичен для интерфейсов с множественным выбором категорий.
Selection может быть преобразован в вычисляемые поля данных:
"transform": [
{
"calculate": "indata('sel_store', 'value', datum.category)",
"as": "selected"
}
]
Это позволяет интегрировать selection в обычный dataflow как переменную.
Selection хранится не как список DOM-объектов, а как компактное состояние:
Это обеспечивает:
В сложных визуализациях selection становится компонуемым элементом:
Композиция позволяет строить многоуровневые взаимодействия без императивной логики.
"selection": {
"brush": {"type": "interval"},
"highlight": {"type": "point"}
}
Каждый слой взаимодействия работает независимо, но влияет на общую систему через dataflow.
Selection можно формализовать как тройку:
S ← E → F
Эта модель делает selection универсальным механизмом связывания пользовательского взаимодействия и декларативного описания визуальных структур в Vega-Lite и Vega.