echarts 3d饼图

立体饼图

  var optionData = [
                 {
                     name: '第一产业',
                    value: "470400",
                     unit:"吨"
                },
                {
                    name: '第二产业',
                    value: "52337100",
                    unit:"吨"
                },
                 {
                     name: '第三产业',
                    value: "4057600",
                    unit:"吨"
                },
            ]
            var option = getPie3D(optionData, 0);
            function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h) {
                const midRatio = (startRatio + endRatio) / 2;
                const startRadian = startRatio * Math.PI * 2;
                const endRadian = endRatio * Math.PI * 2;
                const midRadian = midRatio * Math.PI * 2;
                // 如果只有一个扇形,则不实现选中效果。
                if (startRatio === 0 && endRatio === 1) {
                    isSelected = false;
                }
                k = typeof k !== 'undefined' ? k : 1 / 3;
                const offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
                const offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;
                // 鼠标滑过时外环放大大小
                const hoverRate = isHovered ? 1.05 : 1;
                // 返回曲面参数方程
                return {
                    u: {
                        min: -Math.PI,
                        max: Math.PI * 3,
                        step: Math.PI / 32,
                    },

                    v: {
                        min: 0,
                        max: Math.PI * 2,
                        step: Math.PI / 20,
                    },

                    x(u, v) {
                        if (u < startRadian) {
                            return offsetX + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate;
                        }
                        if (u > endRadian) {
                            return offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate;
                        }
                        return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
                    },

                    y(u, v) {
                        if (u < startRadian) {
                            return offsetY + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate;
                        }
                        if (u > endRadian) {
                            return offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate;
                        }
                        return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
                    },

                    z(u, v) {
                        if (u < -Math.PI * 0.5) {
                            return Math.sin(u);
                        }
                        if (u > Math.PI * 2.5) {
                            return Math.sin(u) * h * 0.1;
                        }
                        // 当前图形的高度是Z根据h(每个value的值决定的)
                        return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;
                    },
                };
            }

            function getPie3D(pieData, internalDiameterRatio) {
                const series = [];
                let sumValue = 0;
                let startValue = 0;
                let endValue = 0;
                const legendData = [];
                const k =
                    typeof internalDiameterRatio !== 'undefined'
                        ? (1 - internalDiameterRatio) / (1 + internalDiameterRatio)
                        : 1 / 3;
                for (let i = 0; i < pieData.length; i += 1) {
                    sumValue += pieData[i].value;
                    const seriesItem = {
                        name: typeof pieData[i].name === 'undefined' ? `series${i}` : pieData[i].name,
                        type: 'surface',
                        parametric: true,
                        wireframe: {
                            show: false,
                        },
                        pieData: pieData[i],
                        pieStatus: {
                            selected: false,
                            hovered: true,
                            k,
                        },
                    };
                    if (typeof pieData[i].itemStyle !== 'undefined') {
                        const { itemStyle } = pieData[i];
                        // eslint-disable-next-line no-unused-expressions
                        typeof pieData[i].itemStyle.color !== 'undefined' ? (itemStyle.color = pieData[i].itemStyle.color) : null;
                        // eslint-disable-next-line no-unused-expressions
                        typeof pieData[i].itemStyle.opacity !== 'undefined'
                            ? (itemStyle.opacity = pieData[i].itemStyle.opacity)
                            : null;

                        seriesItem.itemStyle = itemStyle;
                    }
                    series.push(seriesItem);
                }
                for (let i = 0; i < series.length; i += 1) {
                    // 判断series[i].pieData.value 数字的大小
                    var nums = series[i].pieData.value
                    // .toString()
                    let keys = null
                    if(nums>0 && nums<1000){
                        keys = series[i].pieData.value / 10
                    }else if(nums>=1000 && nums <10000){
                        keys = series[i].pieData.value / 100
                    }else if(nums>=10000 && nums < 100000){
                        keys = series[i].pieData.value / 1000
                    }else{
                        keys = series[i].pieData.value / 10000
                    }
                    
                    endValue = startValue + series[i].pieData.value;
                    series[i].pieData.startRatio = startValue / sumValue;
                    series[i].pieData.endRatio = endValue / sumValue;
                    series[i].parametricEquation = getParametricEquation(
                        series[i].pieData.startRatio,
                        series[i].pieData.endRatio,
                        false,
                        false,
                        k,
                        keys //在此处传入饼图初始高度h
                    );
                    startValue = endValue;
                    legendData.push(series[i].name);
                }
                console.log(series, 'seriesseries')

                let objs = {
                    center: ['50%', '35%'],
                    clockwise: false,
                    data: optionData,
                    name: 'pie2d',
                    type: 'pie',
                    radius: '50%',
                    startAngle: -30,
                    itemStyle: { opacity: 0 },
                    label: {
                        fontSize: 14,
                        lineHeight: 20,
                        opacity: 1,
                        textStyle: {
                            color: "#fff",
                            fontSize: 14,
                        }
                    }
                }
                series.push(objs)
                // 准备待返回的配置项,把准备好的series 传入。
                const option = {
                    legend: {
                        show: true,
                        left: "center",
                        bottom: 10,
                        itemHeight: 8,
                        itemWidth: 20,
                        padding: [10, 20],
                        itemGap: 10,
                        textStyle: {
                            color: "#fff",
                            fontSize: 12,
                            fontWeight: "400",
                        },
                        formatter: (name) => {
                            if (optionData.length) {
                                const item = optionData.filter((item) => item.name === name)[0];
                                return `  ${name}  ${item.value} ${item.unit}        `;
                            }
                        },
                    },
                    color: [
                        '#159AFF',
                        '#66E1DF',
                        '#66E193',
                        '#E3F170',
                        '#FFAD6A',
                        '#ffe0ab',
                        '#6bc5f4',
                        '#c08ef2',
                        '#ffda49'
                    ],
                    tooltip: {
                        formatter: (params) => {
                            console.log(params, 'params')
                            if (params.seriesName !== 'mouseoutSeries') {
                                return `${params.marker}${params.seriesName}:${optionData[params.seriesIndex].value}${optionData[params.seriesIndex].unit}`;
                            }
                            return ``;
                        },
                    },
                    xAxis3D: {
                        min: -1,
                        max: 1,
                    },
                    yAxis3D: {
                        min: -1,
                        max: 1,
                    },
                    zAxis3D: {
                        min: -1,
                        max: 1,
                    },
                    grid3D: {
                        show: false,
                        boxHeight: 25,//修改立体饼图的高度
                        top: '-10%',
                        // left: '-10%',
                        viewControl: {
                            // 3d效果可以放大、旋转等,
                            alpha: 25,//饼图翻转的程度
                            beta: 40,
                            rotateSensitivity: 1,
                            zoomSensitivity: 0,
                            panSensitivity: 0,
                            // autoRotate: fasle,//是否自动旋转
                            distance: 390,//距离越小看到的饼图越大
                        },
                    },
                    series,
                };
                console.log(series, 'seriesseriesseries')
                return option;
            }

            myecharts.setOption(option)

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值