旭日图(Sunburst)本质上是一种多层级环形嵌套结构可视化方案,其核心价值在于直观展示具有明确父子关系的层级数据分布。与传统树形图相比,这种放射状布局特别适合表现3-5层的中等深度数据结构,在有限空间内实现数据密度与可读性的平衡。
典型应用场景包括但不限于:
提示:当层级超过5层时,内环区域会因面积过小导致可读性下降,此时建议考虑桑基图或缩进树等替代方案。
Highcharts要求数据采用特定格式的JSON数组,每个节点必须包含以下字段:
javascript复制{
id: 'unique_id', // 必须字段,节点唯一标识
parent: 'parent_id', // 必须字段,根节点设为空字符串
name: '显示名称', // 必须字段,可视化显示文本
value: 数值, // 可选字段,决定区块面积大小
color: '#FF0000', // 可选字段,自定义区块颜色
// 其他自定义字段...
}
实际案例:某电商平台类目体系数据
javascript复制const categories = [
{ id: 'root', parent: '', name: '全部分类' },
{ id: 'electronics', parent: 'root', name: '数码家电', value: 1200 },
{ id: 'mobile', parent: 'electronics', name: '手机通讯', value: 800 },
{ id: 'apple', parent: 'mobile', name: 'Apple', value: 500 },
{ id: 'android', parent: 'mobile', name: '安卓手机', value: 300 }
];
javascript复制Highcharts.chart('container', {
chart: {
type: 'sunburst',
height: 600 // 必须显式设置高度,避免自动计算异常
},
title: { text: '电商类目销售分布' },
series: [{
data: categories,
allowDrillToNode: true, // 启用点击钻取功能
levels: [{}, {}, {}] // 各层级样式配置数组
}]
});
levels数组按从外到内的顺序控制各层样式:
javascript复制levels: [{
level: 1, // 第一层(最外层)
colorByPoint: true, // 每个节点独立配色
dataLabels: {
rotationMode: 'parallel' // 标签平行于环向
},
levelSize: {
relative: 0.2 // 占据20%半径
}
}, {
level: 2,
colorVariation: { // 基于父节点颜色渐变
key: 'brightness',
to: 0.1
}
}]
通过配置allowDrillToNode启用点击钻取功能后,需配合事件处理实现完整交互流:
javascript复制series: [{
// ...其他配置...
point: {
events: {
click: function() {
console.log('当前节点:', this.name);
// 可在此处发起AJAX请求加载子节点数据
}
}
}
}]
对于大型层级结构,推荐采用动态加载策略:
javascript复制function loadNodeData(nodeId) {
fetch(`/api/categories?parent=${nodeId}`)
.then(res => res.json())
.then(data => {
const chart = Highcharts.charts[0];
chart.series[0].addPoint({
id: data.id,
parent: data.parent,
name: data.name,
value: data.value
});
});
}
推荐使用HSL色彩空间实现层级递进效果:
javascript复制colorAxis: {
minColor: '#FFE4B5',
maxColor: '#FF8C00',
labels: {
formatter: function() {
return this.value + '%';
}
}
}
通过组合以下参数解决标签重叠问题:
javascript复制dataLabels: {
allowOverlap: false,
filter: {
property: 'y',
operator: '>',
value: 20
},
style: {
textOutline: '1px contrast'
}
}
当节点数超过500时,建议:
turboThreshold提升渲染性能javascript复制series: [{
turboThreshold: 1000,
// ...
}]
setData替代addPoint批量更新javascript复制plotOptions: {
series: {
animation: false
}
}
节点丢失问题:
面积计算异常:
点击事件无响应:
allowDrillToNode已设为trueallowDrillToNode: false某零售集团通过旭日图实现全国销售分析看板:
关键技术实现:
javascript复制// 动态响应窗口大小变化
window.addEventListener('resize', function() {
const chart = Highcharts.charts[0];
chart.setSize(null, window.innerHeight * 0.8);
});
// 添加自定义图例
Highcharts.addEvent(Highcharts.Legend, 'afterRender', function() {
this.legendGroup.element.appendChild(createCustomLegend());
});
实际效果提升: