ECharts 旭日图

旭日图(Sunburst)由多层的环形图组成,在数据结构上,内圈是外圈的父节点。因此,它既能像饼图一样表现局部和整体的占比,又能像矩形树图一样表现层级关系。

ECharts 创建旭日图很简单,只需要在 series 配置项中声明类型为 sunburst 即可,data 数据结构以树形结构声明,看下一个简单的实例:

实例

var option ={
    series:{
        type:'sunburst',
        data:[{
            name:'A',
            value:10,
            children:[{
                value:3,
                name:'Aa'
            },{
                value:5,
                name:'Ab'
            }]
        },{
            name:'B',
            children:[{
                name:'Ba',
                value:4
            },{
                name:'Bb',
                value:2
            }]
        },{
            name:'C',
            value:3
        }]
    }
};

尝试一下 »

颜色等样式调整

默认情况下会使用全局调色盘 color 分配最内层的颜色,其余层则与其父元素同色。

在旭日图中,扇形块的颜色有以下三种设置方式:

  • 在 series.data.itemStyle 中设置每个扇形块的样式。
  • 在 series.levels.itemStyle 中设置每一层的样式。
  • 在 series.itemStyle 中设置整个旭日图的样式。

上述三者的优先级是从高到低的,也就是说,配置了 series.data.itemStyle 的扇形块将会覆盖 series.levels.itemStyle 和 series.itemStyle 的设置。

下面,我们将整体的颜色设为灰色 #aaa,将最内层的颜色设为蓝色 blue,将 Aa、B 这两块设为红色 red

实例

var option ={
    series:{
        type:'sunburst',
        data:[{
            name:'A',
            value:10,
            children:[{
                value:3,
                name:'Aa',
                itemStyle:{
                    color:'red'
                }
            },{
                value:5,
                name:'Ab'
            }]
        },{
            name:'B',
            children:[{
                name:'Ba',
                value:4
            },{
                name:'Bb',
                value:2
            }],
            itemStyle:{
                color:'red'
            }
        },{
            name:'C',
            value:3
        }],
        itemStyle:{
            color:'#aaa'
        },
        levels:[{
            // 留给数据下钻的节点属性
        },{
            itemStyle:{
                color:'blue'
            }
        }]
    }
};

尝试一下 »

按层配置样式是一个很常用的功能,能够很大程度上提高配置的效率。


数据下钻

旭日图默认支持数据下钻,也就是说,当点击了扇形块之后,将以该扇形块的数据作为根节点,进一步显示该数据的细节。

在数据下钻后,图形的中间会出现一个用于返回上一层的图形,该图形的样式可以通过 levels[0] 配置。

实例

var data =[{
    name:'Grandpa',
    children:[{
        name:'Uncle Leo',
        value:15,
        children:[{
            name:'Cousin Jack',
            value:2
        },{
            name:'Cousin Mary',
            value:5,
            children:[{
                name:'Jackson',
                value:2
            }]
        },{
            name:'Cousin Ben',
            value:4
        }]
    },{
        name:'Father',
        value:10,
        children:[{
            name:'Me',
            value:5
        },{
            name:'Brother Peter',
            value:1
        }]
    }]
},{
    name:'Nancy',
    children:[{
        name:'Uncle Nike',
        children:[{
            name:'Cousin Betty',
            value:1
        },{
            name:'Cousin Jenny',
            value:2
        }]
    }]
}];

option ={
    series:{
        type:'sunburst',
        // highlightPolicy: 'ancestor',
        data: data,
        radius:[0,'90%'],
        label:{
            rotate:'radial'
        }
    }
};

尝试一下 »

如果不需要数据下钻功能,可以通过将 nodeClick 设置为 false 来关闭,也可以设为 'link',并将 data.link 设为点击扇形块对应打开的链接。


高亮相关扇形块

旭日图支持鼠标移动到某扇形块时,高亮相关数据块的操作,可以通过设置 highlightPolicy,包括以下几种高亮方式:

  • 'descendant'(默认值):高亮鼠标移动所在扇形块与其后代元素;
  • 'ancestor':高亮鼠标所在扇形块与其祖先元素;
  • 'self':仅高亮鼠标所在扇形块;
  • 'none':不会淡化(downplay)其他元素。

上面提到的"高亮",对于鼠标所在的扇形块,会使用 emphasis 样式;对于其他相关扇形块,则会使用 highlight 样式。通过这种方式,可以很方便地实现突出显示相关数据的需求。

具体来说,对于配置项:

itemStyle: {
    color: 'yellow',
    borderWidth: 2,
    emphasis: {
        color: 'red'
    },
    highlight: {
        color: 'orange'
    },
    downplay: {
        color: '#ccc'
    }
}

highlightPolicy 为 'descendant':

实例

option = {
    silent: true,
    series: {
        radius: ['15%', '95%'],
        center: ['50%', '60%'],
        type: 'sunburst',
        sort: null,
        highlightPolicy: 'descendant',
        data: [{
            value: 10,
            children: [{
                name: 'target',
                value: 4,
                children: [{
                    value: 2,
                    children: [{
                        value: 1
                    }]
                }, {
                    value: 1
                }, {
                    value: 0.5
                }]
            }, {
                value: 2
            }]
        }, {
            value: 4,
            children: [{
                children: [{
                    value: 2
                }]
            }]
        }],
        label: {
            normal: {
                rotate: 'none',
                color: '#fff'
            }
        },
        levels: [],
        itemStyle: {
            color: 'yellow',
            borderWidth: 2
        },
        emphasis: {
            itemStyle: {
                color: 'red'
            }
        },
        highlight: {
            itemStyle: {
                color: 'orange'
            }
        },
        downplay: {
            itemStyle: {
                color: '#ccc'
            }
        }
    }
};

setTimeout(function(){
    myChart.dispatchAction({
        type: 'sunburstHighlight',
        targetNodeId: 'target'
    });
});

尝试一下 »

highlightPolicy 为 'ancestor' :

实例

option = {
    silent: true,
    series: {
        radius: ['15%', '95%'],
        center: ['50%', '60%'],
        type: 'sunburst',
        sort: null,
        highlightPolicy: 'ancestor',
        data: [{
            value: 10,
            children: [{
                value: 4,
                children: [{
                    value: 2,
                    children: [{
                        name: 'target',
                        value: 1
                    }]
                }, {
                    value: 1
                }, {
                    value: 0.5
                }]
            }, {
                value: 2
            }]
        }, {
            value: 4,
            children: [{
                children: [{
                    value: 2
                }]
            }]
        }],
        label: {
            normal: {
                rotate: 'none',
                color: '#fff'
            }
        },
        levels: [],
        itemStyle: {
            color: 'yellow',
            borderWidth: 2
        },
        emphasis: {
            itemStyle: {
                color: 'red'
            }
        },
        highlight: {
            itemStyle: {
                color: 'orange'
            }
        },
        downplay: {
            itemStyle: {
                color: '#ccc'
            }
        }
    }
};

setTimeout(function(){
    myChart.dispatchAction({
        type: 'sunburstHighlight',
        targetNodeId: 'target'
    });
});

尝试一下 »

更多实例

更多旭日图配置参考:https://www.echartsjs.com/zh/option.html#series-sunburst