Компонент Sunburst в Nivo строится вокруг иерархической структуры данных, где каждый узел представляет собой сектор кольца, а вложенные узлы формируют внутренние кольца. Основное требование — древовидный формат данных.
Типичная структура:
const data = {
name: "root",
children: [
{
name: "group A",
children: [
{ name: "A1", value: 10 },
{ name: "A2", value: 20 }
]
},
{
name: "group B",
children: [
{ name: "B1", value: 15 },
{ name: "B2", value: 5 }
]
}
]
}
Ключевые особенности структуры:
children определяет вложенностьvalue используется только на листьях дереваSunburst доступен в пакете @nivo/sunburst. Основной
компонент — ResponsiveSunburst.
npm install @nivo/sunburst
Базовое использование:
import { ResponsiveSunburst } from '@nivo/sunburst'
const MySunburst = ({ data }) => (
<ResponsiveSunburst
data={data}
margin={{ top: 10, right: 10, bottom: 10, left: 10 }}
id="name"
value="value"
cornerRadius={2}
borderWidth={1}
borderColor={{ theme: 'background' }}
/>
)
Параметры:
id — поле, определяющее имя узлаvalue — числовое значение листаmargin — отступы визуализацииcornerRadius — скругление сегментовborderColor — цвет границ секторовSunburst использует радиальную декомпозицию пространства. Каждый уровень дерева отображается как отдельное кольцо, где:
Логика распределения:
Это позволяет визуализировать иерархии без потери относительных величин.
Цвета в Sunburst критичны для восприятия структуры. Nivo предоставляет несколько стратегий.
<ResponsiveSunburst
data={data}
colors={{ scheme: 'nivo' }}
/>
<ResponsiveSunburst
data={data}
colors={({ depth }) => {
const palette = ['#4f46e5', '#06b6d4', '#10b981', '#f59e0b']
return palette[depth % palette.length]
}}
/>
colors={{ datum: 'parent.color' }}
Особенности:
Отображение текста внутри секторов требует баланса между информативностью и плотностью данных.
<ResponsiveSunburst
data={data}
enableArcLabels={true}
arcLabel="id"
arcLabelsSkipAngle={10}
arcLabelsTextColor="#ffffff"
/>
Параметры:
enableArcLabels — включает подписиarcLabelsSkipAngle — минимальный угол для
отображенияarcLabelsTextColor — цвет текстаarcLabel — поле или функция для текстаФункциональные подписи:
arcLabel={node => `${node.id} (${node.value})`}
Sunburst поддерживает hover, click и выделение узлов.
<ResponsiveSunburst
data={data}
onCl ick={(node) => {
console.log(node.id, node.value)
}}
isInteractive={true}
animate={true}
/>
Доступные события:
onClick — выбор узлаonMouseEnter — наведениеonMouseLeave — уход курсораСостояние узлов:
active — текущий hoverselected — выбранный элементdisabled — исключён из взаимодействияTooltip позволяет отображать контекстную информацию о сегменте.
<ResponsiveSunburst
data={data}
tooltip={({ id, value, depth, color }) => (
<div style={{ padding: 8, background: '#111', color: '#fff' }}>
<strong>{id}</strong>
<div>Значение: {value}</div>
<div>Глубина: {depth}</div>
</div>
)}
/>
Полезные поля node:
idvaluedepthcolorpathNivo использует плавные переходы для изменения структуры данных.
<ResponsiveSunburst
data={data}
animate={true}
motionConfig="gentle"
/>
Типы motionConfig:
wobbly — выраженная динамикаgentle — мягкие переходыstiff — более резкие измененияПри обновлении данных:
Sunburst позволяет управлять геометрией диаграммы.
<ResponsiveSunburst
data={data}
innerRadius={0.2}
cornerRadius={3}
/>
Параметры:
innerRadius — доля пустого центра (0–1)cornerRadius — скругление сегментовЭффекты:
При глубокой иерархии важно учитывать производительность.
Рекомендации:
Пример оптимизации:
<ResponsiveSunburst
data={data}
animate={false}
enableArcLabels={false}
motionConfig="stiff"
/>
Перед передачей в Sunburst часто требуется предобработка.
Пример агрегации:
function aggregate(node) {
if (!node.children) return node
const value = node.children.reduce((acc, child) => {
const processed = aggregate(child)
return acc + (processed.value || 0)
}, 0)
return {
...node,
value,
children: node.children.map(aggregate)
}
}
Использование:
<ResponsiveSunburst data={aggregate(data)} />
Nivo поддерживает глобальную тему оформления.
<ResponsiveSunburst
data={data}
theme={{
text: {
fontSize: 12,
fill: '#333'
},
tooltip: {
container: {
background: '#222',
color: '#fff'
}
}
}}
/>
Возможности:
Типичные области применения:
Особенность подхода: