Интерактивность в Vega и Vega-Lite реализуется через систему selections, signals и условные выражения в каналах визуального кодирования. Hover-блок представляет собой частный, но крайне важный сценарий взаимодействия, при котором состояние визуализации изменяется в ответ на наведение курсора на элемент графика без необходимости клика или явного выбора.
В Vega-Lite основным механизмом для реализации hover является
selection с типом single, где активное
состояние привязывается к событиям мыши.
Ключевые особенности hover-selection:
mouseovermouseoutБазовая структура hover-селекции:
{
"selection": {
"hover": {
"type": "single",
"on": "mouseover",
"empty": "none",
"clear": "mouseout"
}
}
}
Такая конфигурация формирует временное состояние, которое может быть использовано в любом канале encoding.
Hover-состояние в Vega-Lite чаще всего применяется для динамического изменения следующих параметров:
Пример условного изменения прозрачности:
{
"mark": "circle",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"},
"opacity": {
"condition": {
"selection": "hover",
"value": 1
},
"value": 0.3
}
},
"selection": {
"hover": {
"type": "single",
"on": "mouseover",
"clear": "mouseout"
}
}
}
Логика условного кодирования опирается на проверку принадлежности текущего элемента состоянию selection.
Tooltip в Vega-Lite может работать независимо, однако в сочетании с hover-selection формируется более контролируемая модель взаимодействия.
Базовый вариант tooltip:
{
"mark": "point",
"encoding": {
"x": {"field": "time", "type": "temporal"},
"y": {"field": "value", "type": "quantitative"},
"tooltip": [
{"field": "time", "type": "temporal"},
{"field": "value", "type": "quantitative"}
]
}
}
При добавлении hover-selection tooltip может быть условно усилен или расширен логикой отображения только активного элемента через selection-driven фильтрацию.
Параметр nearest: true позволяет привязывать hover не
строго к геометрии маркера, а к ближайшей точке данных. Это особенно
важно для линий и сложных графиков, где попадание курсором в точный
пиксель точки затруднено.
{
"selection": {
"hover": {
"type": "single",
"nearest": true,
"on": "mouseover",
"clear": "mouseout"
}
}
}
Поведение изменяется следующим образом:
В многослойных визуализациях hover может применяться к отдельным слоям или ко всей композиции.
Пример слоя с подсветкой:
{
"layer": [
{
"mark": "line",
"encoding": {
"x": {"field": "x"},
"y": {"field": "y"}
}
},
{
"mark": "point",
"encoding": {
"x": {"field": "x"},
"y": {"field": "y"},
"opacity": {
"condition": {
"selection": "hover",
"value": 1
},
"value": 0.2
}
}
}
],
"selection": {
"hover": {
"type": "single",
"on": "mouseover",
"clear": "mouseout"
}
}
}
Такой подход отделяет базовую геометрию от интерактивного слоя, что упрощает управление визуальными эффектами.
В Vega hover реализуется через систему signals и событийную модель.
Принцип построения:
signal хранит состояние наведенияevent stream отслеживает mouseover/mouseoutupdate expression изменяет состояниеПример сигнала:
{
"signals": [
{
"name": "hovered",
"value": null,
"on": [
{"events": "symbol:mouseover", "update": "datum"},
{"events": "symbol:mouseout", "update": "null"}
]
}
]
}
Далее сигнал используется в encoding:
{
"marks": [
{
"type": "symbol",
"encode": {
"update": {
"opacity": {
"signal": "hovered ? (datum === hovered ? 1 : 0.3) : 1"
}
}
}
}
]
}
Такой уровень управления позволяет строить сложные интерактивные состояния, выходящие за рамки стандартного Vega-Lite API.
Hover может сосуществовать с другими типами selection, например multi (click-based выделение). В этом случае формируется двухуровневая модель состояния:
Пример комбинирования:
"selection": {
"hover": {
"type": "single",
"on": "mouseover",
"clear": "mouseout"
},
"select": {
"type": "multi",
"on": "click"
}
}
При таком подходе encoding может учитывать оба состояния:
При сочетании нескольких состояний применяется логика приоритетов:
Пример условного выражения:
"opacity": {
"condition": {
"test": "datum === hover || datum === select",
"value": 1
},
"value": 0.2
}
В более сложных случаях используется вложенная логика с проверкой наличия активного hover.
Hover-события являются высокочастотными, поэтому при больших наборах данных важно учитывать:
update выраженияхnearest вместо точного hit-testingОсобенно критично это при визуализациях с тысячами точек, где каждое движение мыши генерирует поток событий.
На практике hover-блок применяется в нескольких устойчивых шаблонах:
Каждый из этих паттернов строится на одном принципе: временное изменение визуального состояния без изменения данных и без фиксации выбора.
Наиболее распространённые проблемы:
clear приводит к «залипанию» состоянияКорректная реализация требует строгого разделения временных и постоянных состояний и минимизации визуального шума при активном взаимодействии.