自定义legend

描述:当前是关于Echarts图表中的 饼图 示例。
 
            const data = [{
        name: '数据1',
        value: 36,
        rate: 12
    },
    {
        name: '数据2',
        value: 20,
        rate: 20
    },
    {
        name: '数据3',
        value: 16,
        rate: -40
    },
    {
        name: '数据4',
        value: 10,
        rate: -15
    },
    {
        name: '数据5',
        value: 9,
        rate: 12
    },
    {
        name: '数据6',
        value: 9,
        rate: -6
    }
]
option = {
    title: {
        text: '{header1| 名称与占比}' +
            '{header2| 数量}' +
            '{header3| 比例}',
        textAlign: 'left',
        left: '49%',
        top: '30%',
        textStyle: {
            color: '#ccc',
            rich: {
                header1: {
                    width: 130,
                    fontSize: 15
                },
                header2: {
                    width: 85,
                    fontSize: 15
                },
                header3: {
                    fontSize: 15
                }
            }
        }
    },
    legend: {
        // selectedMode: false, // 取消图例上的点击事件
        type: 'plain',
        icon: 'circle',
        orient: 'vertical',
        left: '50%',
        top: '35%',
        align: 'left',
        itemGap: 15,
        itemWidth: 10, // 设置宽度
        itemHeight: 10, // 设置高度
        symbolKeepAspect: false,
        textStyle: {
            color: '#000',
            rich: {
                name: {
                    verticalAlign: 'right',
                    align: 'left',
                    width: 35,
                    fontSize: 12
                },
                value: {
                    align: 'left',
                    width: 60,
                    fontSize: 12
                },
                count: {
                    align: 'left',
                    width: 80,
                    fontSize: 12
                },
                upRate: {
                    align: 'left',
                    fontSize: 12,
                    color: '#00cf90'
                },
                downRate: {
                    align: 'left',
                    fontSize: 12,
                    color: '#ff5722'
                }
            }
        },
        data: data.map(item => item.name),
        formatter: function(name) {
            let className = 'upRate'
            let rateIcon = '▲'
            if (data && data.length) {
                for (var i = 0; i < data.length; i++) {
                    if (name === data[i].name) {
                        if (data[i].rate < 0) {
                            className = 'downRate'
                            rateIcon = '▼'
                        }
                        return (
                            '{name| ' +
                            name +
                            '}  | ' +
                            '{value| ' +
                            data[i].value +
                            '%}' +
                            '{count| ' +
                            Number(4544).toLocaleString() +
                            '} ' +
                            '{' + className + '| ' + rateIcon +
                            Math.abs(data[i].rate) +
                            '%}'
                        )
                    }
                }
            }
        }
    },
    series: [{
        name: '数量',
        type: 'pie',
        radius: ['40%', '55%'],
        center: ['25%', '50%'],
        data: data,
        label: {
            normal: {
                show: false,
                position: 'center',
                formatter: '{text|{c}}\n{b}',
                rich: {
                    text: {
                        align: 'center',
                        verticalAlign: 'middle',
                        padding: 8,
                        fontSize: 30
                    },
                    value: {
                        align: 'center',
                        verticalAlign: 'middle',
                        fontSize: 20
                    }
                }
            },
            emphasis: {
                show: true,
                textStyle: {
                    fontSize: '12'
                }
            }
        },
        labelLine: {
            normal: {
                show: true
            }
        }
    }]
};