Матрица рассеяния (SPLOM)

Матрица рассеяния (Scatterplot Matrix, SPLOM) представляет собой композицию нескольких диаграмм рассеяния, организованных в виде квадратной сетки, где каждая ячейка отображает зависимость одной переменной от другой. Такой подход позволяет одновременно анализировать попарные взаимосвязи между множеством числовых признаков и выявлять корреляции, кластеры и выбросы в многомерных данных.

В контексте Vega и Vega-Lite SPLOM реализуется через повторение (repeat), фасетирование (facet) и композицию графиков, а также через управление шкалами (scales), доменами и взаимодействием между графиками.


Концепция SPLOM как композиции графиков

Матрица рассеяния формируется из набора однотипных визуализаций:

  • каждая строка соответствует одной переменной по оси Y
  • каждый столбец соответствует одной переменной по оси X
  • диагональ часто используется для отображения распределений или остаётся пустой

При наличии n переменных формируется n × n графиков, что делает SPLOM вычислительно и визуально насыщенной структурой.

Ключевая идея реализации в Vega-Lite — декларативное описание повторяющегося шаблона визуализации.


Подготовка данных для SPLOM

Данные для 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. Категориальные переменные используются для раскраски точек или фильтрации.


Базовая реализация SPLOM в Vega-Lite

Основной механизм построения матрицы — оператор 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

  • repeat.column задаёт набор переменных по оси X
  • repeat.row задаёт набор переменных по оси Y
  • внутри spec используются ссылки { "repeat": "column" } и { "repeat": "row" }

Этот механизм автоматически генерирует сетку подграфиков без ручного описания каждой комбинации.


Управление масштабами (scales) в SPLOM

Одним из ключевых аспектов корректной 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: facet-композиция

Помимо repeat, SPLOM может быть реализован через facet, особенно в Vega (низкоуровневой версии) или при предварительной трансформации данных.

Facet-структура

{
  "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 }

При больших наборах данных прозрачность становится критическим параметром для предотвращения визуальной перегрузки.


Линковка взаимодействий (brushing & linking)

Одним из наиболее мощных механизмов SPLOM является связанное выделение точек между всеми графиками.

Селекция

"selection": {
  "brush": {
    "type": "interval"
  }
}

Применение селекции

"color": {
  "condition": {
    "selection": "brush",
    "value": "steelblue"
  },
  "value": "lightgray"
}

Эффект заключается в синхронной подсветке точек во всех ячейках матрицы, что позволяет анализировать многомерные связи.


Оптимизация отображения

SPLOM быстро становится тяжёлым при увеличении числа переменных. Основные методы оптимизации:

Ограничение набора переменных

Сокращение числа измерений до наиболее информативных.

Агрегация

Замена точек на:

  • density
  • rect с бинами
  • circle с агрегированными значениями

Пример биннинга

"transform": [
  {
    "bin": true,
    "field": "sepalLength",
    "as": "binnedLength"
  }
]

Управление осями и подписями

В SPLOM оси часто дублируются и перегружают визуализацию. Управление ими включает:

  • отключение подписей внутри ячеек
  • отображение только внешних осей
  • сокращение tick-меток
"axis": {
  "labels": false,
  "ticks": false,
  "title": null
}

Для внешнего оформления используется композиция уровней (layer).


Реализация SPLOM в Vega (низкоуровневый подход)

Vega позволяет более гибко управлять layout через group и вычисляемые сигналы.

Основные элементы:

  • data joins
  • signals
  • layout grids
  • marks

Пример логики:

  • вычисление координат ячейки
  • ручное позиционирование групп
  • отдельные шкалы для каждой пары

Этот подход используется при необходимости нестандартного поведения SPLOM, например:

  • асимметричные матрицы
  • кастомные диагонали
  • динамическая перестройка структуры

Гибридные SPLOM-конструкции

Расширенные варианты включают:

SPLOM + регрессионные линии

"layer": [
  { "mark": "point" },
  {
    "mark": "line",
    "transform": [
      { "regression": "y", "on": "x" }
    ]
  }
]

SPLOM + распределения

Добавление гистограмм на диагональ:

  • histogram для переменной
  • density plot
  • boxplot

Масштабируемость и ограничения модели

При увеличении числа переменных наблюдаются:

  • квадратичный рост числа графиков
  • перегрузка визуального канала
  • падение читаемости корреляций

Практическая граница SPLOM обычно находится в диапазоне 6–12 переменных, после чего предпочтение отдается:

  • PCA-графикам
  • t-SNE / UMAP проекциям
  • корреляционным матрицам

Связь SPLOM и корреляционной матрицы

SPLOM является визуально богатой альтернативой корреляционной матрице:

  • SPLOM показывает форму зависимости
  • корреляционная матрица показывает числовую меру связи

В Vega-Lite корреляционная матрица часто строится через aggregate и calculate, тогда как SPLOM сохраняет исходные данные точек.


Итоговая структура SPLOM в Vega-Lite

Типовая архитектура включает:

  • repeat или facet
  • point mark
  • единые или независимые шкалы
  • цветовое кодирование классов
  • selection brushing
  • управление осями
  • трансформации данных (fold, bin, filter)

Эта комбинация формирует универсальный инструмент анализа многомерных данных в декларативной визуализации Vega/Vega-Lite.