渐变色饼图

描述:当前是关于Echarts图表中的 饼图 示例。
 
            const startAlpha = 1;
const endAlpha = 1;

const color = [{
        r: 252,
        g: 208,
        b: 149
    },
    {
        r: 152,
        g: 246,
        b: 246
    },
    {
        r: 195,
        g: 248,
        b: 181
    },
    {
        r: 238,
        g: 186,
        b: 255
    },
    {
        r: 240,
        g: 108,
        b: 162
    },
    {
        r: 103,
        g: 186,
        b: 243
    }
]

const color1 = [{
        r: 143,
        g: 89,
        b: 43
    },
    {
        r: 98,
        g: 182,
        b: 182
    },
    {
        r: 108,
        g: 208,
        b: 89
    },
    {
        r: 131,
        g: 87,
        b: 157
    },
    {
        r: 190,
        g: 48,
        b: 117
    },
    {
        r: 73,
        g: 56,
        b: 126
    }
]

function getCoordinates(startArc, endArc) {
    const posi = [
        Math.sin(startArc),
        -Math.cos(startArc),
        Math.sin(endArc),
        -Math.cos(endArc)
    ]
    const dx = posi[2] - posi[0]
    const dy = posi[3] - posi[1]

    return getLocation(dx, dy)
}

function getLocation(dx, dy) {
    const tanV = dx / dy
    const directSign = Math.abs(tanV) < 1
    const t = directSign ? tanV : 1 / tanV

    const sign1 = t > 0 ? 1 : -1
    const sign2 = dx > 0 ? 1 : -1
    const sign = directSign ? sign1 * sign2 : sign2

    const group1 = [0.5 - sign * t / 2, 0.5 + sign * t / 2]
    const group2 = sign > 0 ? [0, 1] : [1, 0]
    const group = [...group1, ...group2]
    const keys = directSign ? ['x', 'x2', 'y', 'y2'] : ['y', 'y2', 'x', 'x2']

    let res = {}
    keys.forEach((k, idx) => {
        res[k] = group[idx]
    })
    return res
}


function setGradientColorInItemSyle(datas, colorlist, colorlist1, startAlpha, endAlpha) {
    for (let i = 0; i < datas.length; i++) {
        const color = colorlist[i];
        const color1 = colorlist1[i];

        const startArc = datas[i]._startArc;
        const endArc = datas[i]._endArc;
        // 这里计算了 线性渐变的起止方向
        const coordinates = getCoordinates(startArc, endArc);
        datas[i].itemStyle = {
            color: {
                ...coordinates,
                "type": "linear",
                "global": false,
                // 这里给了 线性渐变的起止颜色
                "colorStops": [{
                    offset: 0,
                    color: `rgba(${color.r}, ${color.g}, ${color.b}, ${startAlpha})`
                }, {
                    offset: 1,
                    color: `rgba(${color1.r}, ${color1.g}, ${color1.b}, ${endAlpha})`
                }]
            }
        }
    }
    return datas
}

const dataArr = [{
        value: 10,
        name: '问题1',
        "_startArc": 0,
        "_endArc": 1,
    },
    {
        value: 20,
        name: '问题2',
        "_startArc": 0,
        "_endArc": 1,
    },
    {
        value: 30,
        name: '问题3',
        "_startArc": 0,
        "_endArc": 1,
    },
    {
        value: 40,
        name: '问题4',
        "_startArc": 0,
        "_endArc": 1,
    },
    {
        value: 50,
        name: '问题5',
        "_startArc": 0,
        "_endArc": 1,
    },
    {
        value: 60,
        name: '问题6',
        "_startArc": 0,
        "_endArc": 1,
    }
]

option = {
    tooltip: {
        trigger: 'item',
        formatter: "{b} : {c} ({d}%)"
    },
    backgroundColor: "rgba(73,129,173,.2)",
    legend: {
        orient: 'vertical',
        x: '70%',
        y: "center",
        itemWidth: 30,
        itemHeight: 10,
        formatter: function(name) {
            const oa = option.series[0].data;
            const num = oa.reduce((prev, curr) => {
                return prev + curr.value
            }, 0)
            for (let i = 0; i < option.series[0].data.length; i++) {
                if (name == oa[i].name) {
                    return name + '   ' + ((oa[i].value / num * 100).toFixed(1)) + '%';
                }
            }
        },
        textStyle: {
            color: "#FFFFFF",
            fontSize: 18,
            lineHeight: 20
        }
    },
    title: {
        x: "30%",
        y: "center",
        text: "每日问题\n发现情况",
        textStyle: {
            color: "#FFFFFF",
            fontSize: 30,
            lineHeight: 40
        }
    },
    series: [{
        name: '',
        type: 'pie',
        radius: ['55%', '70%'],
        center: ['35%', '50%'],
        data: setGradientColorInItemSyle(dataArr, color, color1, startAlpha, endAlpha),
        itemStyle: {
            normal: {
                label: {
                    show: false,
                    formatter: '{c} ({d}%)'
                }
            },
            labelLine: {
                show: true
            }
        }
    }]
}