Cross-filtering представляет собой механизм взаимодействия между
несколькими визуализациями, при котором выбор данных в одном
представлении автоматически влияет на отображение данных в других. В
контексте Vega и Vega-Lite этот подход является ключевым элементом
построения интерактивных дашбордов, обеспечивая координированное
исследование данных (coordinated multiple views, CMV). Основная идея
заключается в том, что пользовательский жест — выделение, клик,
диапазонный выбор — преобразуется в сигнал или фильтр, который
переиспользуется другими графиками.
В Vega архитектура взаимодействия строится на основе
signals и data transformations. Каждый
интерактивный жест порождает сигнал, который может быть:
- локальным (в пределах одного графика),
- глобальным (разделяемым между несколькими визуализациями).
Cross-filtering возникает тогда, когда один сигнал используется как
вход для фильтрации данных в нескольких независимых наборах данных или
сценах.
Ключевые компоненты:
- signals — реактивные переменные, отражающие
пользовательский ввод;
- scale domains — динамически изменяемые области
отображения;
- data transforms — фильтрация, агрегация и
вычисления;
- event streams — события мыши и клавиатуры.
Связка этих элементов позволяет построить систему, где визуализации
не связаны напрямую, но реагируют на общие состояния.
Базовый механизм реализации
в Vega
На уровне Vega cross-filtering обычно реализуется через следующий
паттерн:
- Создаётся сигнал, фиксирующий выбранный диапазон или категорию.
- Сигнал обновляется через interaction (например,
rect:brush, click).
- Несколько dataset используют этот сигнал в
filter.
Пример логики:
- пользователь выделяет диапазон на scatter plot;
- сигнал
brush хранит координаты;
- другие графики используют
filter: datum.x in brush.x && datum.y in brush.y.
Важный момент: фильтрация происходит декларативно, без императивного
управления DOM.
Cross-filtering в
Vega-Lite через selections
Vega-Lite предоставляет более высокоуровневую абстракцию —
selections, которые автоматически компилируются в
Vega-конструкции.
Основные типы selection:
interval — диапазонное выделение (brush);
single — выбор одного элемента;
multi — множественный выбор категорий.
Механизм cross-filtering реализуется через параметр
bind и передачу selection между слоями или отдельными
view.
Пример логики interval
selection
В Vega-Lite:
- создаётся selection
brush;
- он применяется к одному графику;
- другие графики используют его как фильтр через transform
filter.
Ключевая особенность: Vega-Lite автоматически синхронизирует
signal-состояние между представлениями при компиляции в Vega.
Передача
состояния между несколькими визуализациями
Cross-filtering становится полноценным только при наличии нескольких
независимых view. В Vega это достигается двумя основными способами:
1. Общие сигналы (top-level
signals)
Сигнал объявляется на уровне spec и используется во всех
подграфиках:
- один сигнал
selectedCategory;
- несколько datasets используют
transform: filter на
основе этого сигнала.
Это наиболее прямой способ, обеспечивающий строгую синхронизацию.
2. Event-driven propagation
События одного view изменяют сигнал, который затем обновляет другие
view:
- click в bar chart обновляет
selectedBar;
- scatter plot фильтруется по
selectedBar;
- line chart агрегирует только отфильтрованные данные.
Типовые сценарии
cross-filtering
Связь bar chart → scatter
plot
Один из наиболее распространённых паттернов.
- Bar chart выбирает категорию;
- Scatter plot отображает только точки выбранной категории.
Фильтрация:
datum.category === selectedCategory
Brush selection → histogram +
table
Brush на scatter plot задаёт диапазон:
- histogram пересчитывает распределение только внутри выбранной
области;
- таблица отображает записи, попадающие в диапазон.
Multi-view dashboard
coordination
В сложных дашбордах несколько представлений могут быть связаны через
единый слой состояния:
- временной ряд;
- географическая карта;
- категориальные распределения.
Все они реагируют на один набор сигналов:
- timeRange;
- selectedRegion;
- selectedCategory.
Декларативная фильтрация
данных
В Vega и Vega-Lite cross-filtering не требует мутаций исходных
данных. Вместо этого применяется цепочка трансформаций:
- исходный dataset остаётся неизменным;
- создаётся derived dataset;
- применяется
filter на основе сигналов.
Пример логики:
- data → transform(filter by signal) → encoding.
Это обеспечивает:
- предсказуемость;
- отсутствие побочных эффектов;
- возможность повторного использования данных.
Производительность
cross-filtering
При работе с большими наборами данных критичны следующие аспекты:
1. Локальная
фильтрация vs глобальная агрегация
- локальная фильтрация (datum-level) быстрее;
- агрегации внутри filtered view требуют пересчёта.
2. Минимизация пересчёта
сигналов
Vega оптимизирует реактивные графы зависимостей, но сложные цепочки
сигналов могут вызывать избыточные обновления.
3. Использование
pre-aggregated datasets
В Vega-Lite часто применяется стратегия:
- подготовка агрегатов заранее;
- фильтрация только по индексу или ключу.
Связанные сигналы и
синхронизация состояний
При масштабировании дашбордов возникает задача синхронизации
нескольких типов взаимодействий:
- brush selection;
- hover highlight;
- click selection.
Cross-filtering может комбинировать их:
- hover подсвечивает элементы без фильтрации;
- click фиксирует состояние фильтра;
- brush задаёт диапазон.
Сигналы могут быть связаны логически:
selectedItem
highlightedItem
activeRange
Каждый из них влияет на разные слои визуализации.
Условная фильтрация и
композиция логики
Vega поддерживает сложные выражения в фильтрах:
- логические операторы;
- арифметические сравнения;
- условные конструкции.
Cross-filtering часто требует композиции:
- категория AND диапазон времени;
- категория OR исключения;
- инвертированные фильтры.
Пример логики:
- показывать datum, если он попадает в selectedCategory И внутри
selectedRange.
Cross-filtering и layered
views
В Vega-Lite layered charts позволяют строить несколько слоёв в одном
view, однако cross-filtering между слоями имеет ограничения:
- слой разделяет данные;
- но selection может быть глобальным.
Для независимых cross-view взаимодействий чаще используется concat
или facet.
Faceted views и
автоматическая координация
Facet-композиция предоставляет естественную форму
cross-filtering:
- каждый facet — подмножество данных;
- selection в одном facet может влиять на другие через общие
signals.
Однако важно учитывать:
- facet создаёт локальные data scopes;
- сигналы должны быть выведены на уровень выше для синхронизации.
Расширенные техники
cross-filtering
1. Inverse filtering
Отображение не выбранных данных:
- selected → highlight;
- non-selected → fade.
Реализуется через условные encoding expressions.
2. Linked brushing
Несколько brush-инструментов:
- горизонтальный диапазон (x-axis);
- вертикальный диапазон (y-axis);
- комбинированная область.
3. Drill-down фильтрация
Cross-filtering может использоваться как навигация:
- уровень 1: категории;
- уровень 2: подкатегории;
- уровень 3: отдельные записи.
Каждый уровень уточняет фильтр.
Архитектурные паттерны
Shared state layer
Единый объект состояния:
- хранит selection;
- используется всеми view;
- обновляется через сигналы.
Event bus approach
Сигналы выступают как события:
- view A эмитит selection;
- view B и C подписываются.
Declarative binding model
Самый характерный для Vega подход:
- связывание через выражения;
- отсутствие явных подписок;
- реактивная компиляция зависимостей.
Ограничения и нюансы
Cross-filtering в Vega/Vega-Lite имеет ряд особенностей:
- сложность отладки signal-графов;
- потенциальная перегрузка при множестве взаимных зависимостей;
- различия поведения между Vega и Vega-Lite при компиляции;
- необходимость аккуратного управления scope сигналов.
Особенно важно учитывать:
- избыточное использование глобальных сигналов приводит к трудно
предсказуемым обновлениям;
- локальные selections проще контролировать, но хуже масштабируются на
несколько view.
Практическая модель
взаимодействия
Типичный pipeline cross-filtering:
- пользователь взаимодействует с графиком;
- генерируется event;
- event обновляет signal;
- signal пересчитывает derived dataset;
- несколько view реагируют на обновлённые данные;
- происходит перерисовка только затронутых слоёв.
Эта цепочка является основой интерактивной аналитики в
Vega-экосистеме.