IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> echarts 3D环状饼图 -> 正文阅读

[JavaScript知识库]echarts 3D环状饼图

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style lang="">
        #pie3D {
            width: 500px;
            height: 300px;
        }
    </style>
</head>

<body>
    <div id="pie3D"></div>
    <script src="./echarts.js"></script>
    <script src="./echarts-gl.js"></script>
    <script>
        // 生成扇形的曲面参数方程,用于 series-surface.parametricEquation
        function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, height) {

            // 计算
            let midRatio = (startRatio + endRatio) / 2;

            let startRadian = startRatio * Math.PI * 2;
            let endRadian = endRatio * Math.PI * 2;
            let midRadian = midRatio * Math.PI * 2;

            // 如果只有一个扇形,则不实现选中效果。
            if (startRatio === 0 && endRatio === 1) {
                isSelected = false;
            }

            // 通过扇形内径/外径的值,换算出辅助参数 k(默认值 1/3)
            k = typeof k !== 'undefined' ? k : 1 / 3;

            // 计算选中效果分别在 x 轴、y 轴方向上的位移(未选中,则位移均为 0)
            let offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
            let offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;

            // 计算高亮效果的放大比例(未高亮,则比例为 1)
            let 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: function(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: function(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: function(u, v) {
                    if (u < -Math.PI * 0.5) {
                        return Math.sin(u);
                    }
                    if (u > Math.PI * 2.5) {
                        return Math.sin(u);
                    }
                    return Math.sin(v) > 0 ? 1 * height : -1;
                }
            };
        }

        // 生成模拟 3D 饼图的配置项
        function getPie3D(pieData, internalDiameterRatio) {

            let series = [];
            let sumValue = 0;
            let startValue = 0;
            let endValue = 0;
            let legendData = [];
            let k = typeof internalDiameterRatio !== 'undefined' ? (1 - internalDiameterRatio) / (1 + internalDiameterRatio) : 1 / 3;

            // 为每一个饼图数据,生成一个 series-surface 配置
            for (let i = 0; i < pieData.length; i++) {

                sumValue += pieData[i].value;

                let 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: false,
                        k: k
                    }
                };

                if (typeof pieData[i].itemStyle != 'undefined') {

                    let itemStyle = {};

                    typeof pieData[i].itemStyle.color != 'undefined' ? itemStyle.color = pieData[i].itemStyle.color : null;
                    typeof pieData[i].itemStyle.opacity != 'undefined' ? itemStyle.opacity = pieData[i].itemStyle.opacity : null;

                    seriesItem.itemStyle = itemStyle;
                }
                series.push(seriesItem);
            }

            // 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数,
            // 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。
            for (let i = 0; i < series.length; i++) {
                endValue = startValue + series[i].pieData.value;
                console.log(series[i]);
                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, series[i].pieData.value);

                startValue = endValue;

                legendData.push(series[i].name);
            }



            // 准备待返回的配置项,把准备好的 legendData、series 传入。
            let option = {
                tooltip: {
                    formatter: params => {
                        if (params.seriesName !== 'mouseoutSeries') {
                            return `${params.seriesName}<br/><span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>${option.series[params.seriesIndex].pieData.value}`;
                        }
                    },
                    show: false
                },
                legend: {
                    show: false,
                    data: legendData,
                    textStyle: {
                        color: '#fff',
                        fontSize: 26
                    }
                },
                xAxis3D: {
                    min: -1,
                    max: 1
                },
                yAxis3D: {
                    min: -1,
                    max: 1
                },
                zAxis3D: {
                    min: -1,
                    max: 1
                },
                grid3D: {
                    show: false,
                    boxHeight: 20,
                    //top: '30%',
                    bottom: '50%',
                    environment: '#021041',
                    viewControl: {
                        distance: 300,
                        alpha: 25,
                        beta: 130,
                    },

                },
                series: series
            };
            return option;
        }

        var color = ['rgba(250,235,215,0.6)', 'rgba(80,212,175,0.6)', 'rgba(155,178,27,0.6)', 'rgba(220,86,111,0.6)']
        var optionData = [{
                name: '已消除',
                value: 3,
                itemStyle: {
                    opacity: 0.7,
                    color: 'red',
                }
            }, {
                name: '未消除',
                value: 1,
                itemStyle: {
                    opacity: 0.7,
                    color: 'green',
                }
            }, {
                name: '未消除2',
                value: 2,
                itemStyle: {
                    opacity: 0.7,
                    color: 'pink',
                }
            }, {
                name: '未消除3',
                value: 4,
                itemStyle: {
                    opacity: 0.7,
                    color: 'orange',
                }
            }

        ]

        function setLabel() {
            optionData.forEach((item, index) => {
                item.itemStyle = {
                    color: color[index]
                }
                item.label = {
                    normal: {
                        show: true,
                        color: color[index],
                        formatter: [
                            '{b|{b}}',
                            '{c|{c}}{b|台}',
                            '{d|{d}%}'
                        ].join('\n'), // 用\n来换行
                        rich: {
                            b: {
                                color: '#fff',
                                lineHeight: 25,
                                align: 'left'
                            },
                            c: {
                                fontSize: 22,
                                color: '#fff',
                                textShadowColor: '#1c90a6',
                                textShadowOffsetX: 0,
                                textShadowOffsetY: 2,
                                textShadowBlur: 5
                            },
                            d: {
                                color: color[index],
                                align: 'left'
                            }
                        }
                    }
                }
                item.labelLine = {
                    normal: {
                        lineStyle: {
                            width: 1,
                            color: 'rgba(255,255,255,0.7)'
                        }
                    }
                }
            })
        }

        setLabel()

        var statusChart = echarts.init(document.getElementById('pie3D'))

        var pieoption = {}
            // 传入数据生成 option
        pieoption = getPie3D(optionData, 2);
        pieoption.series.push({
            name: '电梯状态', //自己根据场景修改
            backgroundColor: 'transparent',
            type: 'pie',
            label: {
                opacity: 1,
                fontSize: 13,
                lineHeight: 20
            },
            startAngle: -40, // 起始角度,支持范围[0, 360]。
            clockwise: false, // 饼图的扇区是否是顺时针排布。上述这两项配置主要是为了对齐3d的样式
            radius: ['20%', '50%'],
            center: ['50%', '50%'],
            data: optionData,
            itemStyle: {
                opacity: 0 //这里必须是0,不然2d的图会覆盖在表面
            }
        })
        statusChart.setOption(pieoption)
    </script>
</body>

</html>
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:24:14  更:2021-10-20 12:25:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 15:47:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码