Параллельные координаты представляют собой способ визуализации многомерных данных, в котором каждая переменная отображается на отдельной вертикальной оси, а наблюдения представляются ломаными линиями, пересекающими эти оси в соответствующих значениях. Такой подход позволяет анализировать сложные зависимости между множеством признаков одновременно, выявлять кластеры, выбросы и корреляции, которые трудно заметить в классических диаграммах рассеяния.
В контексте экосистемы Vega и Vega-Lite реализация параллельных координат имеет принципиальное различие: Vega-Lite предоставляет ограниченные средства для многомерных представлений через трансформации данных, тогда как Vega позволяет построить полноценную гибкую спецификацию с явным контролем масштабов, координат и интерактивности.
Исходные данные обычно представляются в виде таблицы, где каждая строка — это наблюдение, а столбцы — признаки:
[
{ "id": 1, "speed": 42, "power": 130, "efficiency": 0.8 },
{ "id": 2, "speed": 55, "power": 115, "efficiency": 0.72 },
{ "id": 3, "speed": 38, "power": 140, "efficiency": 0.85 }
]
Для параллельных координат данные необходимо преобразовать из «широкого» формата в «длинный», где каждый показатель становится отдельной записью:
[
{ "id": 1, "dimension": "speed", "value": 42 },
{ "id": 1, "dimension": "power", "value": 130 },
{ "id": 1, "dimension": "efficiency", "value": 0.8 }
]
Такое преобразование является ключевым этапом в Vega, поскольку визуализация строится вокруг группировки по идентификатору объекта.
В Vega параллельные координаты обычно реализуются через комбинацию
transform, scale, axis и
marks.
line marks) — соединяющие значения одного
объектаПример минимальной спецификации:
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"width": 600,
"height": 300,
"padding": 5,
"data": [
{
"name": "table",
"values": [
{ "id": 1, "speed": 42, "power": 130, "efficiency": 0.8 },
{ "id": 2, "speed": 55, "power": 115, "efficiency": 0.72 },
{ "id": 3, "speed": 38, "power": 140, "efficiency": 0.85 }
],
"transform": [
{
"type": "fold",
"fields": ["speed", "power", "efficiency"],
"as": ["dimension", "value"]
}
]
}
]
}
Ключевой аспект параллельных координат — согласование множества осей.
Каждая переменная отображается как отдельная позиция:
{
"name": "xscale",
"type": "point",
"domain": { "data": "table", "field": "dimension" },
"range": "width"
}
Общая числовая шкала:
{
"name": "yscale",
"type": "linear",
"domain": { "data": "table", "field": "value" },
"range": "height",
"nice": true,
"zero": true
}
В практических задачах часто требуется отдельная нормализация для каждого измерения. Это усложняет модель, но улучшает визуальную читаемость при разных диапазонах данных.
Для построения линий необходимо сгруппировать точки по идентификатору:
{
"type": "groupby",
"fields": ["id"],
"ops": ["values"],
"as": ["points"]
}
Каждый объект превращается в последовательность точек, упорядоченных по измерениям.
В Vega линии строятся через mark line, где каждая серия
соответствует отдельному объекту:
{
"type": "line",
"from": { "data": "table" },
"encode": {
"enter": {
"x": { "scale": "xscale", "field": "dimension" },
"y": { "scale": "yscale", "field": "value" },
"stroke": { "value": "steelblue" },
"strokeWidth": { "value": 1.5 }
},
"update": {
"interpolate": { "value": "linear" }
}
}
}
При большом количестве объектов используется прозрачность
(opacity) для уменьшения визуального шума.
Параллельные координаты в Vega часто дополняются интерактивными механизмами:
{
"type": "opacity",
"test": "datum.id === hover_id",
"value": 1
}
Используются interval selections, позволяющие
фильтровать данные по оси:
{
"name": "brush",
"type": "interval",
"encodings": ["y"]
}
Это позволяет анализировать поведение объектов в заданных диапазонах значений.
В Vega-Lite прямой поддержки параллельных координат нет как специализированного типа графика, однако их можно приблизительно реализовать через преобразование данных:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{ "id": 1, "speed": 42, "power": 130, "efficiency": 0.8 }
]
},
"transform": [
{
"fold": ["speed", "power", "efficiency"],
"as": ["dimension", "value"]
}
],
"mark": "line",
"encoding": {
"x": { "field": "dimension", "type": "nominal" },
"y": { "field": "value", "type": "quantitative" },
"detail": { "field": "id" }
}
}
Однако такой подход имеет ограничения:
Поэтому для полноценных параллельных координат предпочтение отдается чистому Vega.
При разных диапазонах признаков используется нормализация:
[ x’ = ]
В Vega это реализуется через formula transform:
{
"type": "formula",
"as": "norm_value",
"expr": "(datum.value - min) / (max - min)"
}
Нормализация позволяет привести все оси к единому масштабу и повысить сопоставимость признаков.
При увеличении количества объектов возникают проблемы:
Для оптимизации применяются:
opacity < 0.1 для фоновых линийЦвет используется для дополнительного измерения:
"stroke": {
"scale": "color",
"field": "category"
}
Это позволяет выделять классы объектов поверх многомерной структуры.
Параллельные координаты в Vega строятся по следующей цепочке:
Эта модель делает спецификацию декларативной, позволяя изменять поведение графика без изменения императивного кода.
Изменение порядка измерений влияет на восприятие корреляций. В Vega это реализуется через изменение domain шкалы X.
Параллельные координаты часто комбинируются с:
Селекции позволяют динамически исключать объекты из визуализации без пересоздания всего графа.
Параллельные координаты позволяют выявлять:
В системах аналитики Vega такие графики часто применяются для многомерного мониторинга системных метрик, производительности алгоритмов и анализа экспериментальных данных.