Sunburst — это иерархическая круговая диаграмма для визуализации данных с несколькими уровнями вложенности (деревьев).
Каждый уровень структуры (например, год → категория → продукт) отображается отдельным кольцом, а ветви разной длины позволяют наглядно увидеть иерархию, объёмы, структуру.
Области применения:
Отображение иерархий и распределения: оргструктуры, ассортимент, категории, бюджеты, процессы Разбор состава и вложенности (например, продажи по категориям, департаментам, регионам) Визуализация путей, разветвлений, распределений с разной глубиной группировки
Как работает:
Центр диаграммы — корневой уровень (например, "Год"). Каждый следующий уровень — новое кольцо, отражающее дочерние элементы (категории, подкатегории, объекты и т.д.). Ветвь может заканчиваться на любом уровне (необязательно все ветки одной глубины). Размер сектора соответствует значению у соответствующего элемента.
Структура данных:
Каждый элемент — объект с обязательным полем name, может содержать поле value и массив children (для дочерних элементов). Можно делать разную глубину ветвления.
Оператор данных показан ниже, в нем будет изменяться data в зависимости от количества передаваемых полей.
function dataCal(originData) {
var dataModels = originData.dataModels;
var colData = dataModels[0].colData;
var data = [];
for (var i = 0; i < colData[0].length; i++) {
data[i] = {
value: colData[3][i],
product: colData[2][i],
category: colData[1][i],
year: colData[0][i]
};
}
return data;
}В операторе конфигурации данные преобразуются к нужному виду.
function optionCal(data, chartConfig, chart) {
var yearMap = {};
data.forEach(function(item) {
var year = item.year || item['year'];
var category = item.category || item['category'];
var product = (item.product || item['product'] || '').toString().trim();
var value = Math.round(Number(item.value));
if (!yearMap[year]) yearMap[year] = { name: year, children: [] };
// ищем, есть ли уже такая категория
var catNode = yearMap[year].children.find(function(child) {
return child.name === category;
});
if (!catNode) {
catNode = { name: category, children: [] };
yearMap[year].children.push(catNode);
}
if (product) {
// если продукт задан, добавляем на уровень продукта
catNode.children.push({
name: product,
value: value
});
} else {
// если продукт отсутствует, кладём value на категорию
catNode.value = value;
}
});
// Преобразуем в массив для sunburst
var sunburstData = Object.values(yearMap);
var option = {
title: { text: 'Sunburst Chart Example', left: 'center' },
tooltip: {},
series: [{
type: 'sunburst',
data: sunburstData,
radius: [0, '90%'],
label: { rotate: 'radial' }
}]
};
return option;
}