画一个有label标签的嵌套关系旭日图

236 阅读4分钟

旭日关系图

首先,推荐一个不错的Echarts Demo网站www.isqqw.com/ 让我可以快速的找到想要的图表,以及快速定位要修改的图表配置项。为了方便日后再碰到这种图表能不费吹灰之力便可画出想要的echarts图,我还是选择记录一下(每次画都忘-_- )我自己画的旭日图在这里奥:www.isqqw.com/viewer?id=3…

这次记录的是一个之前听过但自己没做过的图-旭日图,这是一种关系图,类似饼图实现的圆环图,但比圆环图表功能丰富,能明显的看出数据的归属层级分类,看下面的图吧:

WX20230522-222807@2x.png

内圈是种类数据,外圈是种类数据的具体值,一对比就很明的看出数据的分类了。

图表代码

const {

    redFlower, // 红花种类

    whiteFlower, // 白花种类

    lessThanStandardRate, // 小于标准

    greaterThanStandardRate, // 大于标准

    greaterThanOverallRate, // 大于整体占比

    lessThanOverallRate, // 小于整体占比

}= {

    redFlower:17, // 红花种类

    whiteFlower:83, // 白花种类

    lessThanStandardRate:20.83, // 小于标准

    greaterThanStandardRate:79.17, // 大于标准

    greaterThanOverallRate:65.52, // 大于整体占比

    lessThanOverallRate:17.24, // 小于整体占比

}

option = {

    series:[

    {

        type: 'sunburst',

        nodeClick: false, // 是否允许旭日图点击 默认可以点击

        center: ['50%', '50%'],

        radius: ['50%', '60%'],

        sort: 'null',

        startAngle: 145,

        silent: true, // 不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件

        labelLayout: {

        moveOverlap: 'shiftY',//在标签重叠的时候是否挪动标签位置以防止重叠。shiftY:垂直方向依次位移,在垂直方向对齐时使用

        hideOverlap: false,//是否隐藏重叠的标签

        },

        // 旭日图的分割线 可通过调节圆的大小实现空白间隙

        // itemStyle: {

        // borderColor: 'transparent',

        // borderWidth: 0,

        // borderRadius: 0,

        // },

    data: [{

        name: '白花种类',

        value: whiteFlower ?? 0,

        itemStyle: { color: '#358EFE' },

        // 标签

        label: {

            show: true,

            borderColor: 'transparent',

            borderWidth: 1,

            padding: 6,

            formatter: ['{a|{b}}', '{c|{c}%}'].join(''),//{c} 为数据值

            // 给指定标签设置样式

            rich: {

                a: {

                    align: 'left',

                    color: '#4E5969',

                    fontSize: 14,

                    fontWeight: 400,

                    padding: [0, 4, 0, 0],

                },

                c: {

                    align: 'left',

                    color: '#4E5969',

                    fontSize: 16,

                    fontWeight: 600,

                },

            },

        },

        //标签的视觉引导线配置。

        labelLine: {

            show: true,

            showAbove: true,//是否显示在图形上方

            length2: 6,//视觉引导项第二段的长度

            minTurnAngle: 0,//通过调整第二段线的长度,限制引导线两端之间最小的夹角,以防止过小的夹角导致显示不美观。可以设置为 0 - 180 度。

        },




        children: [{

            value: lessThanOverallRate ?? 0,

            name: '百合',

            itemStyle: { color: 'rgba(53, 142, 254, 0.20)' },

            label: {

            formatter: ['{a|{b}}', `{b|${lessThanStandardRate ?? 0}%}`, '\n', '{c|(整体占比 {c}%)}'].join(''),

            rich: {

                a: {

                    align: 'left',

                    color: '#4E5969',

                    fontSize: 14,

                    fontWeight: 400,

                    padding: [0, 4, 0, 0],

                },

                b: {

                    align: 'left',

                    color: '#4E5969',

                    fontSize: 16,

                    fontWeight: 600,

                    fontFamily: 'DINAlternate-Bold, DINAlternate',

                },

                c: {

                    align: 'left',

                    color: 'rgba(136, 136, 136, .9)',

                    fontSize: 12,

                    fontWeight: 400,

                    padding: [4, 0, 0, 0],

                    fontFamily: 'DINAlternate-Bold, DINAlternate',

                },

            },

        },

        labelLine: {

            show: true,

            showAbove: true,

            length2: 8,

            },

        },

        {

        value: greaterThanOverallRate ?? 0,

        name: '茉莉',

        itemStyle: { color: 'rgba(53, 142, 254, 0.50)' },

        label: {

        formatter: ['{a|{b}}', `{b|${greaterThanStandardRate ?? 0}%}`, '\n', '{c|(整体占比 {c}%)}'].join(''),

        rich: {

            a: {

                align: 'left',

                color: '#4E5969',

                fontSize: 14,

                fontWeight: 400,

                padding: [0, 4, 0, 0],

            },

            b: {

                align: 'left',

                color: '#4E5969',

                fontSize: 16,

                fontWeight: 600,

                fontFamily: 'DINAlternate-Bold, DINAlternate',

            },

            c: {

                align: 'left',

                color: 'rgba(136, 136, 136, .9)',

                fontSize: 12,

                padding: [4, 0, 0, 0],

                fontFamily: 'DINAlternate-Bold, DINAlternate',

            },

        },

        },

        labelLine: {

            show: true,

            showAbove: true,

            length2: 8,

        },

        },

        ],

    },

    {

        name: '红花种类',

        value: redFlower ?? 0,

        itemStyle: { color: '#12C2C1' },

        label: {

        show: true,

        formatter: ['{a|{b}}', '{c|{c}%}'].join(''),

        rich: {

            a: {

                align: 'left',

                color: '#4E5969',

                fontSize: 14,

                fontWeight: 400,

                padding: [0, 4, 0, 0],

            },

            c: {

                align: 'left',

                color: '#4E5969',

                fontSize: 16,

                fontWeight: 600,

                fontFamily: 'DINAlternate-Bold, DINAlternate',

            },

        },

    },

    labelLine: {

        show: true,

        showAbove: true,

        length2: 6,

    },

    children: [
            { value: parseFloat(100 - lessThanOverallRate - greaterThanOverallRate), name: '', itemStyle: { color: 'rgba(18, 194, 193, 0.60)' } }],

        },

        ],

        // 占据的位置 文字设置

        // label: {

        // rotate: 'tangential', // 文字水平(tangential)竖直(radial)

        // color: '#fff',

        // fontSize: 14,

        // minAngle: 30, // 控制角度文本显示

        // },




    levels: [

        // 这里是设置 每一层的样式,层级低于单独在data里面的

        // 第一个空数据是 占据下钻的位置

        {},

        // 内圈

        {

        r0: '48%',

        r: '63%',

        // 鼠标移入高亮设置 设置了slient=true会失效

        emphasis: {

        focus: 'none',

    },

    label: {

        position: 'outside',//标签的位置

        distance: 22,//距离图形元素的距离

        rotate: 0, // 文字水平(tangential)竖直(radial)

        minAngle: 0,//当某个扇形块的角度小于该值(角度制)时,扇形块对应的文字不显示。该值用以隐藏过小扇形块中的文字。

        //以下三个设置可以让距离比较靠近的label有一定的间距,与html标签样式有点区别的是,这里需要设置一个border后再设置padding,padding内边距才会起效果

        borderColor: 'transparent',//

        borderWidth: 1,

        padding: 4,

        },

    },

    // 外圈

    {

        r0: '63%',

        r: '77%',

        label: {

            position: 'outside',

            distance: 22,

            rotate: 0, // 文字水平(tangential)竖直(radial)

            alignTo: 'edge',

            minAngle: 0,

            borderColor: 'transparent',

            borderWidth: 1,

            padding: 4,

        },

        // 鼠标移入高亮设置

        emphasis: {

            focus: 'none',

        },

    },

    ],

    },

]

};

End

这个图虽说不难,但自己做出来也着实费了一番心思,总结一下,后面总会用到的。顺便,别忘了去试试奥 ~www.isqqw.com/viewer?id=3…