ehcarts生成彩虹图,半圆饼图,蚊香图等

其实这三种图我都认为是一种图,都是饼图的变形,需求长这样子
在这里插入图片描述
我的效果图这样子
在这里插入图片描述
想要一模一样自己改改颜色就行了

我们先生成完整的蚊香图,众所周知,我们正常的饼图只是把seriesData配置一次,然后把数据全部塞进去,就好,如官网示例
在这里插入图片描述

那想要生成很多条数据,我们把series里面的每一条数据都按比例分(比如100处长啥样,40分长啥样,60分长啥样),搞成很多条就好了,循环数据,把每一个数据都搞成一个seriesData数据条,就变成一圈一圈的了

const obj = {//定义要用到的变量:
    series: [],
    maxRadius: 90,
    barWidth: 6,
    barGap: 2,
    // sumValue: 0,
    showValue: true,
    showPercent: true,
    option: {},
    //图形数据
    PieDatas: [
        {
            "value": 95,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率"
        },
        {
            "value": 85,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率"
        },
        {
            "value": 35,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率"
        },
        {
            "value": 65,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率"
        },
        {
            "value": 100,
            "name": "XXXXXXXXXXXXXXXX完整率识别准确率"
        },
        {
            "value": 55,
            "name": "XXXXXXX完整率时钟准确率"
        },
        {
            "value": 75,
            "name": "车XXXXXXXXXX数据XXXXXXXXXX完整率上传率"
        }, {
            "value": 95,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率上传率"
        }, {
            "value": 15,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率可用率"
        }, {
            "value": 25,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率用率"
        },
    ],
    //图形颜色
    BarColor: [
        {
            "color1": "#4E9DFF",
            "color2": ""
        },
        {
            "color1": "#36C4F7",
            "color2": ""
        },
        {
            "color1": "#65D4AB",
            "color2": ""
        },
        {
            "color1": "#9FFF8D",
            "color2": ""
        },
        {
            "color1": "#FFE154",
            "color2": ""
        },
        {
            "color1": "#FFB854",
            "color2": ""
        }, {
            "color1": "#FF9254",
            "color2": ""
        }, {
            "color1": "#FF8181",
            "color2": ""
        }, {
            "color1": "#FF81BA",
            "color2": ""
        }, {
            "color1": "#DC81FF",
            "color2": ""
        },
    ],
}

我们制作两个 series数据条,直接把数据条显示成有颜色的,不足100%的用灰色显示,以下是series中的data写法

    data: [
                  {
                    value: item.value,
                    name: item.name,
                    itemStyle: {
                        color: obj.BarColor[i].color1
                    }
                }, {
                    value: 100 - item.value,
                    name: '',
                    itemStyle: {
                        color: "transparent",
                    },
                    tooltip: {
                        show: false
                    },
                    hoverAnimation: false
                }]

完整版循环代码

 obj.PieDatas.forEach((item, i) => {
            obj.series.push({
                center: ['50%', '60%'],
                type: 'pie',
                // clockWise: false, //顺时加载
                hoverAnimation: false, //鼠标移入变大
                radius: [(obj.maxRadius - i * (obj.barGap + obj.barWidth)) + '%', (obj.maxRadius - (i + 1) * obj.barWidth - i * obj.barGap) + '%'],
                label: {
                    show: false
                },
                itemStyle: {
                    label: {
                        show: false,
                    },
                    labelLine: {
                        show: false
                    },
                    borderWidth: 5,
                },
                data: [
                 {
                    value: item.value,
                    name: item.name,
                    itemStyle: {
                        color: obj.BarColor[i].color1
                    }
                }, {
                    value: 100 - item.value,
                    name: '',
                    itemStyle: {
                        color: "transparent",
                    },
                    tooltip: {
                        show: false
                    },
                    hoverAnimation: false
                }]
            })
        })

在这里插入图片描述

想制作带底色的图,我们再写一个series, 底色改成灰色就行,蚊香图就出来了

 obj.PieDatas.forEach((item, i) => {
  obj.series.push({
                // startAngle: 0,
                // endAngle: 180,
                // radius: ['40%', '70%'],
                center: ['50%', '60%'],
                name: 'blank',
                type: 'pie',
                silent: true,
                z: 0,
                // clockWise: false, //顺时加载
                hoverAnimation: false, //鼠标移入变大
                radius: [(obj.maxRadius - i * (obj.barGap + obj.barWidth)) + '%', (obj.maxRadius - (i + 1) * obj.barWidth - i * obj.barGap) + '%'],
                // center: ["30%", "50%"],
                label: {
                    show: false
                },
                itemStyle: {
                    label: {
                        show: false,
                    },
                    labelLine: {
                        show: false
                    },
                    borderWidth: 5,
                },
                data: [{
                    value: 1,
                    itemStyle: {
                        color: "#f7f7f7",//圆圈另一半的颜色
                        // color: "transparent",
                        borderWidth: 0
                    },
                    tooltip: {
                        show: false
                    },
                    hoverAnimation: false
                }]
            });
         })

在这里插入图片描述
最后就是制作成半圆形,制作半圆的精髓就是咱们把刚才设置的第2个series设置成透明色,或者把直接把第2个series数据删除,然后第一个series数据条的底色设置成想要的颜色就ok,然后再设置`起始角度结束角度等,我们先来看这个图
在这里插入图片描述

咱们设置startAngle和endAngle,然后根据自己的需求看是否要设置顺时加载colockWise等属性,要设置彩虹底色可以自定义颜色等,直接放setOption完整代码吧

 
        obj.PieDatas.forEach((item, i) => {
            obj.series.push({
                startAngle: 0,
                endAngle: 180,
                // radius: ['40%', '70%'],
                center: ['50%', '60%'],
                type: 'pie',
                // clockWise: false, //顺时加载
                hoverAnimation: false, //鼠标移入变大
                radius: [(obj.maxRadius - i * (obj.barGap + obj.barWidth)) + '%', (obj.maxRadius - (i + 1) * obj.barWidth - i * obj.barGap) + '%'],
                // center: ["30%", "50%"],
                label: {
                    show: false
                },
                itemStyle: {
                    label: {
                        show: false,
                    },
                    labelLine: {
                        show: false
                    },
                    borderWidth: 5,
                },
                data: [{
                    value: 100,
                    itemStyle: {
                        normal: {
                            color: "transparent" // 透明色
                        }
                    }, name: ''
                }, {
                    value: item.value,
                    name: item.name,
                    itemStyle: {
                        color: obj.BarColor[i].color1
                    }
                }, {
                    value: 100 - item.value,
                    name: '',
                    itemStyle: {
                        color: "#f7f7f7",
                    },
                    tooltip: {
                        show: false
                    },
                    hoverAnimation: false
                }]
            })
            // 制作半圆图时这段要不要都可
            // obj.series.push({
            //     startAngle: 0,
            //     endAngle: 180,
            //     // radius: ['40%', '70%'],
            //     center: ['50%', '60%'],
            //     name: 'blank',
            //     type: 'pie',
            //     silent: true,
            //     z: 0,
            //     // clockWise: false, //顺时加载
            //     hoverAnimation: false, //鼠标移入变大
            //     radius: [(obj.maxRadius - i * (obj.barGap + obj.barWidth)) + '%', (obj.maxRadius - (i + 1) * obj.barWidth - i * obj.barGap) + '%'],
            //     // center: ["30%", "50%"],
            //     label: {
            //         show: false
            //     },
            //     itemStyle: {
            //         label: {
            //             show: false,
            //         },
            //         labelLine: {
            //             show: false
            //         },
            //         borderWidth: 5,
            //     },
            //     data: [{
            //         value: 1,
            //         itemStyle: {
            //             // color: "#f7f7f7",//圆圈另一半的颜色
            //             color: "transparent",
            //             borderWidth: 0
            //         },
            //         tooltip: {
            //             show: false
            //         },
            //         hoverAnimation: false
            //     }]
            // });

        })
        obj.option = {
            // startAngle: 180,
            // endAngle: 360,
            grid: {
                left: 0,
                right: 0,
                top: 0,
                bottom: 0,
            },
            backgroundColor: '#fff',
            tooltip: {
                show: true,
                trigger: "item",
            },
            legend: {//右侧文字
                show: true,
                left: '20%',
                top: 'bottom',
                icon: "circle",
                itemWidth: 6,
                itemHeight: 8,
                itemGap: 5,
                textStyle: {
                    //右侧字体样式
                    rich: {
                        bothNameValue: {
                            width: 300,  //给文字设置统一长度,保证右侧的百分比对齐
                        },
                        title: {
                            fontSize: 14,
                            lineHeight: 16,
                            color: '#999999',
                            width: 260,
                        },
                        value: {
                            color: '#489DF7',
                            fontSize: 18,
                            fontFimely: 'DIN Alternate'
                        }
                    }
                },
                formatter: (name) => {
                    var datas = obj.PieDatas;
                    let total = 0;
                    datas.map(item => {
                        total += (item.value - 0)
                    })
                    let valueIndex = datas.map(item => item.name).indexOf(name);
                    let htmlValue = obj.showPercent ? datas[valueIndex].value + "%" : ''
                    return "{title|" + name + "} {value|" + htmlValue + "}"
                    // return name + "  " + (obj.showPercent ? ((datas[valueIndex].value / total) * 100).toFixed(2) + "%" : '');
                },

            },
            series: obj.series,

        }

react demo完整版代码,可直接复制粘贴

import React, { useEffect, useState } from 'react';


const obj = {//定义要用到的变量:
    series: [],
    maxRadius: 90,
    barWidth: 6,
    barGap: 2,
    // sumValue: 0,
    showValue: true,
    showPercent: true,
    option: {},
    //图形数据
    PieDatas: [
        {
            "value": 95,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率"
        },
        {
            "value": 85,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率"
        },
        {
            "value": 35,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率"
        },
        {
            "value": 65,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率"
        },
        {
            "value": 100,
            "name": "XXXXXXXXXXXXXXXX完整率识别准确率"
        },
        {
            "value": 55,
            "name": "XXXXXXX完整率时钟准确率"
        },
        {
            "value": 75,
            "name": "车XXXXXXXXXX数据XXXXXXXXXX完整率上传率"
        }, {
            "value": 95,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率上传率"
        }, {
            "value": 15,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率可用率"
        }, {
            "value": 25,
            "name": "XXXXXXXXXX数据XXXXXXXXXX完整率用率"
        },
    ],
    //图形颜色
    BarColor: [
        {
            "color1": "#4E9DFF",
            "color2": ""
        },
        {
            "color1": "#36C4F7",
            "color2": ""
        },
        {
            "color1": "#65D4AB",
            "color2": ""
        },
        {
            "color1": "#9FFF8D",
            "color2": ""
        },
        {
            "color1": "#FFE154",
            "color2": ""
        },
        {
            "color1": "#FFB854",
            "color2": ""
        }, {
            "color1": "#FF9254",
            "color2": ""
        }, {
            "color1": "#FF8181",
            "color2": ""
        }, {
            "color1": "#FF81BA",
            "color2": ""
        }, {
            "color1": "#DC81FF",
            "color2": ""
        },
    ],
}

const PieChart = (props) => {
    const {
        // data,
        // isEmpty,
        width = '500px',
        height = '500px',
        // radius = [fitChartSize(50), fitChartSize(60)], // 饼图的半径
        // title = '',
        // subTitle = '达成率',
        // gradient = false, // 渐变
        // showLable = false,
        // centerTextFontSize = fitChartSize(16)
        // color,
        // value,
        // value2,
        // value3,
        // value4,
        // tooltipShowPercent,
        // unit = '',
    } = props;


    const [option, setOption] = useState(null);

    useEffect(() => {
        setOptionData();
    }, []);

    const setOptionData = () => {
        // 指定图表的配置项和数据
        console.log('    obj.pieDatas', obj)

        obj.PieDatas.forEach((item, i) => {
            obj.series.push({
                startAngle: 0,
                endAngle: 180,
                // radius: ['40%', '70%'],
                center: ['50%', '60%'],
                type: 'pie',
                // clockWise: false, //顺时加载
                hoverAnimation: false, //鼠标移入变大
                radius: [(obj.maxRadius - i * (obj.barGap + obj.barWidth)) + '%', (obj.maxRadius - (i + 1) * obj.barWidth - i * obj.barGap) + '%'],
                // center: ["30%", "50%"],
                label: {
                    show: false
                },
                itemStyle: {
                    label: {
                        show: false,
                    },
                    labelLine: {
                        show: false
                    },
                    borderWidth: 5,
                },
                data: [{
                    value: 100,
                    itemStyle: {
                        normal: {
                            color: "transparent" // 透明色
                        }
                    }, name: ''
                }, {
                    value: item.value,
                    name: item.name,
                    itemStyle: {
                        color: obj.BarColor[i].color1
                    }
                }, {
                    value: 100 - item.value,
                    name: '',
                    itemStyle: {
                        color: "#f7f7f7",
                    },
                    tooltip: {
                        show: false
                    },
                    hoverAnimation: false
                }]
            })
            // obj.series.push({
            //     startAngle: 0,
            //     endAngle: 180,
            //     // radius: ['40%', '70%'],
            //     center: ['50%', '60%'],
            //     name: 'blank',
            //     type: 'pie',
            //     silent: true,
            //     z: 0,
            //     // clockWise: false, //顺时加载
            //     hoverAnimation: false, //鼠标移入变大
            //     radius: [(obj.maxRadius - i * (obj.barGap + obj.barWidth)) + '%', (obj.maxRadius - (i + 1) * obj.barWidth - i * obj.barGap) + '%'],
            //     // center: ["30%", "50%"],
            //     label: {
            //         show: false
            //     },
            //     itemStyle: {
            //         label: {
            //             show: false,
            //         },
            //         labelLine: {
            //             show: false
            //         },
            //         borderWidth: 5,
            //     },
            //     data: [{
            //         value: 1,
            //         itemStyle: {
            //             // color: "#f7f7f7",//圆圈另一半的颜色
            //             color: "transparent",
            //             borderWidth: 0
            //         },
            //         tooltip: {
            //             show: false
            //         },
            //         hoverAnimation: false
            //     }]
            // });

        })
        obj.option = {
            // startAngle: 180,
            // endAngle: 360,
            grid: {
                left: 0,
                right: 0,
                top: 0,
                bottom: 0,
            },
            backgroundColor: '#fff',
            tooltip: {
                show: true,
                trigger: "item",
            },
            legend: {//右侧文字
                show: true,
                left: '20%',
                top: 'bottom',
                icon: "circle",
                itemWidth: 6,
                itemHeight: 8,
                itemGap: 5,
                textStyle: {
                    //右侧字体样式
                    rich: {
                        bothNameValue: {
                            width: 300,  //给文字设置统一长度,保证右侧的百分比对齐
                        },
                        title: {
                            fontSize: 14,
                            lineHeight: 16,
                            color: '#999999',
                            width: 260,
                        },
                        value: {
                            color: '#489DF7',
                            fontSize: 18,
                            fontFimely: 'DIN Alternate'
                        }
                    }
                },
                formatter: (name) => {
                    var datas = obj.PieDatas;
                    let total = 0;
                    datas.map(item => {
                        total += (item.value - 0)
                    })
                    let valueIndex = datas.map(item => item.name).indexOf(name);
                    let htmlValue = obj.showPercent ? datas[valueIndex].value + "%" : ''
                    return "{title|" + name + "} {value|" + htmlValue + "}"
                    // return name + "  " + (obj.showPercent ? ((datas[valueIndex].value / total) * 100).toFixed(2) + "%" : '');
                },

            },
            series: obj.series,

        }

        setOption(obj.option)
    }

    return <MyChart chartOption={option} width={width} height={height} />;
}

export default PieChart;

MyChart 就是把echarts init封装了一下,自己按官网的示例,把数据塞进去就行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值