Компонент Radar в Nivo реализует радиальную диаграмму (паутинную диаграмму), предназначенную для сравнения нескольких наборов значений по общим категориям. Он используется для визуализации многомерных данных, где каждая ось соответствует отдельному показателю, а значения отображаются в виде замкнутого многоугольника.
Основой работы Radar является строго определённая структура входного массива объектов. Каждый объект представляет отдельную серию данных:
const data = [
{
id: 'A',
data: [
{ axis: 'speed', value: 120 },
{ axis: 'strength', value: 80 },
{ axis: 'accuracy', value: 90 }
]
},
{
id: 'B',
data: [
{ axis: 'speed', value: 100 },
{ axis: 'strength', value: 95 },
{ axis: 'accuracy', value: 70 }
]
}
];
Ключевые особенности структуры:
id — уникальный идентификатор серииdata — массив измеренийaxis — категория (ось)value — числовое значение по осиПри несоответствии структуры компонент не сможет корректно построить радиальную сетку.
Базовая конфигурация компонента задаёт поведение визуализации, масштабирование и обработку данных.
<Radar
data={data}
keys={['A', 'B']}
indexBy="axis"
maxValue="auto"
/>
Основной источник данных. Должен соответствовать описанной структуре.
Массив идентификаторов серий, используемых для построения отдельных
полигонов. Каждое значение id в data должно соответствовать
ключу.
Определяет поле, которое используется как ось (категория). Обычно это
axis.
Определяет максимальное значение шкалы:
"auto" — вычисляется автоматическиАвтоматический режим обеспечивает адаптацию под динамические данные, однако фиксированное значение полезно для сравнимости графиков.
Radar-компонент предоставляет набор параметров для управления геометрией радиальной сетки.
margin={{ top: 40, right: 40, bottom: 40, left: 40 }}
Определяет внешние отступы области построения. При недостаточном margin подписи и легенды могут обрезаться.
gridLevels={5}
Количество концентрических окружностей (уровней сетки). Чем больше значение, тем детальнее шкала.
gridShape="circular"
Возможные значения:
circular — круговая сеткаlinear — многоугольная сеткаКруговая форма используется чаще, так как лучше соответствует радиальной природе диаграммы.
colors={{ scheme: 'nivo' }}
Поддерживаются:
Пример функции:
colors={(d) => d.id === 'A' ? '#ff0000' : '#0000ff'}
borderWidth={2}
borderColor={{ from: 'color', modifiers: [['darker', 0.3]] }}
Позволяет управлять контуром полигонов. Использование
from: 'color' обеспечивает согласованность с основной
палитрой.
dotSize={4}
dotColor={{ theme: 'background' }}
dotBorderWidth={2}
dotBorderColor={{ from: 'color' }}
Точки отображают значения на осях. Их конфигурация критична для читаемости при небольшом количестве категорий.
Масштабирование значений определяется через maxValue и
внутреннюю нормализацию данных.
Если задано:
maxValue={200}
все значения преобразуются по формуле нормализации:
При auto используется максимальное значение среди всех
серий и категорий.
Важно учитывать, что изменение maxValue влияет на форму
полигона, а не на абсолютные значения данных.
Конфигурация легенд позволяет управлять отображением серий.
legends={[
{
anchor: 'top-left',
direction: 'column',
translateX: -50,
translateY: -40,
itemWidth: 80,
itemHeight: 20,
symbolSize: 12,
symbolShape: 'circle'
}
]}
Основные параметры:
anchor — позиция легендыdirection — направление элементовtranslateX / translateY — смещениеsymbolShape — форма маркераЛегенды критичны при большом количестве серий, так как Radar визуально перегружен при высокой плотности данных.
Tooltip отображает детализированную информацию по точке.
tooltip={({ point }) => (
<div>
<strong>{point.serieId}</strong>
<div>{point.axis}: {point.value}</div>
</div>
)}
Доступные поля:
point.serieId — серияpoint.axis — осьpoint.value — значениеpoint.color — цвет серииTooltip может быть полностью переопределён, что позволяет внедрять сложную бизнес-логику (например, сравнительные подсказки между сериями).
Radar поддерживает встроенные анимации переходов.
animate={true}
motionConfig="gentle"
Основные пресеты:
wobbly — более динамичные переходыgentle — плавные измененияstiff — резкие переходыАнимации применяются при:
При большом объёме данных анимации могут влиять на производительность, особенно при частых обновлениях состояния.
Radar позволяет управлять слоями отрисовки:
layers={[
'grid',
'layers',
'dots',
'legends'
]}
Доступные слои:
grid — сеткаlayers — полигоны серийdots — точки значенийlegends — легендыПереопределение порядка слоёв используется для кастомизации визуальной иерархии.
<Radar
data={data}
keys={['A', 'B']}
indexBy="axis"
maxValue="auto"
margin={{ top: 40, right: 40, bottom: 40, left: 40 }}
curve="linearClosed"
borderWidth={2}
borderColor={{ from: 'color' }}
gridLevels={5}
gridShape="circular"
dotSize={5}
dotColor={{ theme: 'background' }}
dotBorderWidth={2}
enableDots={true}
enableDotLabel={false}
colors={{ scheme: 'nivo' }}
fillOpacity={0.25}
blendMode="normal"
animate={true}
motionConfig="gentle"
legends={[
{
anchor: 'top-left',
direction: 'column',
translateX: -50,
translateY: -40,
itemWidth: 80,
itemHeight: 20,
symbolSize: 12,
symbolShape: 'circle'
}
]}
/>
Параметр curve управляет способом соединения точек:
linearClosed — прямые линии с замыканием контураcatmullRomClosed — сглаженные кривыеbasisClosed — мягкие интерполяцииВыбор типа кривой влияет на восприятие формы данных: линейные подчёркивают точность, сглаженные — тенденции.
fillOpacity={0.3}
blendMode="multiply"
fillOpacity регулирует визуальную плотность
заливкиblendMode управляет поведением наложения серийПри пересечении нескольких полигонов режим наложения существенно влияет на читаемость пересекающихся областей.
Radar чувствителен к выбросам. При наличии экстремальных значений:
Рекомендуется нормализация данных до передачи в компонент или
использование фиксированного maxValue.
При пустом data компонент не рендерит полигоны, но
сохраняет структуру сетки при наличии конфигурации осей. Это позволяет
поддерживать стабильный layout интерфейса даже при отсутствии
данных.