Лепестковая диаграмма относится к полярным визуализациям, где каждое
измерение отображается на собственной оси, расходящейся из центра. В
Vega и Vega-Lite такая диаграмма строится через преобразование
категориальных данных в угловую координату и числовых значений — в
радиальную. Несмотря на отсутствие отдельного примитива «radar chart»,
он формируется комбинацией стандартных каналов: theta,
radius, а также трансформаций данных.
Основой является переход от декартовой системы к полярной:
Ключевой момент заключается в том, что каждая ось лепестковой диаграммы соответствует категории, равномерно распределённой по окружности.
Исходные данные обычно имеют «широкий» формат:
[
{ "category": "Скорость", "A": 5, "B": 3 },
{ "category": "Точность", "A": 4, "B": 2 },
{ "category": "Стабильность", "A": 3, "B": 4 }
]
Для Vega-Lite требуется преобразование в «длинный» формат через
fold:
transform: [
{
fold: ["A", "B"],
as: ["series", "value"]
}
]
После трансформации данные приобретают вид:
Скорость, A, 5
Скорость, B, 3
...
Лепестковая диаграмма в Vega-Lite строится через
mark: "line" или mark: "area" с полярными
каналами.
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{ "axis": "Скорость", "series": "A", "value": 5 },
{ "axis": "Точность", "series": "A", "value": 4 },
{ "axis": "Стабильность", "series": "A", "value": 3 }
]
},
"mark": {
"type": "line",
"point": true,
"interpolate": "linear-closed"
},
"encoding": {
"theta": {
"field": "axis",
"type": "nominal"
},
"radius": {
"field": "value",
"type": "quantitative"
},
"color": {
"field": "series",
"type": "nominal"
}
}
}
Важный аспект radar chart — замкнутая форма. В Vega-Lite это обеспечивается:
interpolate: "linear-closed" для линийПри сравнении объектов используется группировка по
color:
"encoding": {
"theta": { "field": "axis", "type": "nominal" },
"radius": { "field": "value", "type": "quantitative" },
"color": { "field": "series", "type": "nominal" }
}
Каждая серия образует отдельный многоугольник.
Для корректной визуализации радиальная шкала должна быть унифицирована.
Часто используется преобразование:
[ x’ = ]
В Vega-Lite:
{
"calculate": "(datum.value - 0) / (10 - 0)",
"as": "normalized"
}
И затем:
"radius": { "field": "normalized", "type": "quantitative" }
Для заполненной диаграммы применяется area:
"mark": {
"type": "area",
"interpolate": "linear-closed",
"opacity": 0.3
}
Это создаёт залитый многоугольник, усиливая восприятие формы профиля.
Порядок категорий критически важен. Без сортировки Vega-Lite может упорядочить их лексикографически, что исказит форму.
"encoding": {
"theta": {
"field": "axis",
"type": "nominal",
"sort": ["Скорость", "Точность", "Стабильность"]
}
}
При наличии сырых данных применяется агрегация:
{
"aggregate": [
{
"op": "mean",
"field": "value",
"as": "avgValue"
}
],
"groupby": ["axis", "series"]
}
Это позволяет строить radar chart на основе наблюдений.
Хотя Vega-Lite абстрагирует систему координат, Vega предоставляет
более низкоуровневый контроль через polar transform и
вычисление углов:
Vega-Lite ограничивает это, но упрощает построение стандартных случаев.
Несколько слоёв можно комбинировать через layer:
"layer": [
{ "mark": "area", ... },
{ "mark": "line", ... }
]
Это позволяет одновременно показывать:
Используется условное форматирование:
"color": {
"condition": {
"test": "datum.axis === 'Скорость'",
"value": "red"
},
"value": "steelblue"
}
Радиальная шкала управляется через scale:
"radius": {
"field": "value",
"type": "quantitative",
"scale": {
"domain": [0, 10],
"range": [0, 150]
}
}
Это определяет физический размер диаграммы.
При большом количестве осей возникает проблема плотности:
Решения в Vega-Lite:
labelAnglefilterКачество формы зависит от interpolate:
linear-closed — стандартный выборcardinal — сглаженная формаcatmull-rom — более мягкая кривизна"interpolate": "cardinal-closed"
circle координат без контроля
масштабаVega-Lite поддерживает базовую интерактивность:
"selection": {
"highlight": {
"type": "single",
"on": "mouseover",
"empty": "none"
}
}
Это позволяет подсвечивать отдельные серии.
Типичная композиция включает:
transform → приведение данных к длинному форматуtheta → категориальные осиradius → числовые значенияmark → line/area с замыканиемcolor → разделение серийscale → нормализацияЭта комбинация превращает стандартную табличную структуру в полярное многомерное представление, где геометрия фигуры отражает профиль данных.