Матрица рассеяния (Scatterplot Matrix, SPLOM) представляет собой композицию нескольких диаграмм рассеяния, организованных в виде квадратной сетки, где каждая ячейка отображает зависимость одной переменной от другой. Такой подход позволяет одновременно анализировать попарные взаимосвязи между множеством числовых признаков и выявлять корреляции, кластеры и выбросы в многомерных данных.
В контексте Vega и Vega-Lite SPLOM реализуется через повторение (repeat), фасетирование (facet) и композицию графиков, а также через управление шкалами (scales), доменами и взаимодействием между графиками.
Матрица рассеяния формируется из набора однотипных визуализаций:
При наличии n переменных формируется n × n
графиков, что делает SPLOM вычислительно и визуально насыщенной
структурой.
Ключевая идея реализации в Vega-Lite — декларативное описание повторяющегося шаблона визуализации.
Данные для SPLOM обычно представляют собой плоскую таблицу:
[
{ "a": 5.1, "b": 3.5, "c": 1.4, "d": 0.2, "species": "setosa" },
{ "a": 4.9, "b": 3.0, "c": 1.4, "d": 0.2, "species": "setosa" }
]
Числовые поля становятся кандидатами для осей X и Y. Категориальные переменные используются для раскраски точек или фильтрации.
Основной механизм построения матрицы — оператор
repeat.
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": { "url": "data/iris.json" },
"repeat": {
"row": ["sepalLength", "sepalWidth", "petalLength", "petalWidth"],
"column": ["sepalLength", "sepalWidth", "petalLength", "petalWidth"]
},
"spec": {
"mark": "point",
"encoding": {
"x": { "field": { "repeat": "column" }, "type": "quantitative" },
"y": { "field": { "repeat": "row" }, "type": "quantitative" },
"color": { "field": "species", "type": "nominal" }
}
}
}
repeat.column задаёт набор переменных по оси Xrepeat.row задаёт набор переменных по оси Yspec используются ссылки
{ "repeat": "column" } и
{ "repeat": "row" }Этот механизм автоматически генерирует сетку подграфиков без ручного описания каждой комбинации.
Одним из ключевых аспектов корректной SPLOM является настройка шкал.
По умолчанию Vega-Lite создаёт независимые шкалы для каждой ячейки. Это может привести к разной визуальной интерпретации диапазонов.
Для сохранения сопоставимости используется параметр:
"resolve": {
"scale": {
"x": "shared",
"y": "shared"
}
}
Единые шкалы обеспечивают корректное сравнение распределений между различными парами переменных.
Диагональные элементы SPLOM часто не несут информации о взаимосвязи
переменных. Для их исключения применяется фильтрация через
transform.
Пример логики исключения совпадающих переменных:
"transform": [
{ "calculate": "datum.row !== datum.column", "as": "showCell" }
]
Далее используется фильтр:
"transform": [
{ "filter": "datum.showCell" }
]
В Vega-Lite такие операции часто комбинируются с repeat
через дополнительный слой или вычисляемые поля.
Помимо repeat, SPLOM может быть реализован через
facet, особенно в Vega (низкоуровневой версии) или при
предварительной трансформации данных.
{
"facet": {
"row": { "field": "yVar", "type": "nominal" },
"column": { "field": "xVar", "type": "nominal" }
},
"spec": {
"mark": "point",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y", "type": "quantitative" }
}
}
}
В этом подходе данные предварительно преобразуются в длинный формат (long format), где каждая строка описывает пару переменных.
Для facet-реализации требуется reshape:
Исходная структура:
| a | b | c |
|---|---|---|
| 1 | 2 | 3 |
Преобразование:
| xVar | yVar | x | y |
|---|---|---|---|
| a | b | 1 | 2 |
| a | c | 1 | 3 |
| b | c | 2 | 3 |
В Vega-Lite это может быть выполнено через fold:
"transform": [
{
"fold": ["a", "b", "c"],
"as": ["variable", "value"]
}
]
SPLOM усиливается использованием дополнительных каналов визуализации:
color — категориальные группы (например, классы
объектов)size — дополнительная числовая переменнаяopacity — плотность точекПример:
"color": {
"field": "species",
"type": "nominal"
},
"opacity": { "value": 0.7 }
При больших наборах данных прозрачность становится критическим параметром для предотвращения визуальной перегрузки.
Одним из наиболее мощных механизмов SPLOM является связанное выделение точек между всеми графиками.
"selection": {
"brush": {
"type": "interval"
}
}
"color": {
"condition": {
"selection": "brush",
"value": "steelblue"
},
"value": "lightgray"
}
Эффект заключается в синхронной подсветке точек во всех ячейках матрицы, что позволяет анализировать многомерные связи.
SPLOM быстро становится тяжёлым при увеличении числа переменных. Основные методы оптимизации:
Сокращение числа измерений до наиболее информативных.
Замена точек на:
densityrect с бинамиcircle с агрегированными значениями"transform": [
{
"bin": true,
"field": "sepalLength",
"as": "binnedLength"
}
]
В SPLOM оси часто дублируются и перегружают визуализацию. Управление ими включает:
"axis": {
"labels": false,
"ticks": false,
"title": null
}
Для внешнего оформления используется композиция уровней
(layer).
Vega позволяет более гибко управлять layout через group
и вычисляемые сигналы.
Основные элементы:
data joinssignalslayout gridsmarksПример логики:
Этот подход используется при необходимости нестандартного поведения SPLOM, например:
Расширенные варианты включают:
"layer": [
{ "mark": "point" },
{
"mark": "line",
"transform": [
{ "regression": "y", "on": "x" }
]
}
]
Добавление гистограмм на диагональ:
При увеличении числа переменных наблюдаются:
Практическая граница SPLOM обычно находится в диапазоне 6–12 переменных, после чего предпочтение отдается:
SPLOM является визуально богатой альтернативой корреляционной матрице:
В Vega-Lite корреляционная матрица часто строится через
aggregate и calculate, тогда как SPLOM
сохраняет исходные данные точек.
Типовая архитектура включает:
repeat или facetpoint markЭта комбинация формирует универсальный инструмент анализа многомерных данных в декларативной визуализации Vega/Vega-Lite.