ECharts配置个性化图表:圆环、立体柱状图

ECharts配置个性化图表:圆环、立体柱状图

        • 圆环图
        • 双纵轴多数据面积图
        • 折柱混合图
        • 3D立体圆环饼图
        • 3D立体饼图
        • 参考文章

官网调试地址:点击跳转调试

圆环图

效果图:
在这里插入图片描述
配置:

option = {
  color: ['#29BEFF', '#A2DC00', '#FFC400', '#FF7F5C', '#CA99FC'],
  // 提示窗
  tooltip: {
    trigger: 'item',
    show: false
  },
  // 图例
  legend: {
    top: '5%',
    left: 'center',
    show: false
  },
  // 数据
  series: [
    {
      name: 'Access From',
      type: 'pie',
      radius: ['35%', '60%'], //可以设置圆环的宽度
      avoidLabelOverlap: false,
      itemStyle: {
        borderColor: '#fff',
        borderWidth: 2
      },
      label: {
        show: true,
        formatter: '{d}%',
        position: 'outside',
        fontSize: 11,
        color: '#999'
      },
      emphasis: {
        label: {
          show: false,
          formatter: ['{a|{b}}', '{b|{c}}'].join('\n'),
          rich: {
            a: {
              fontFamily: 'PingFangSC-Regular',
              fontSize: 11,
              color: '#999',
              textAlign: 'center',
              lineHeight: 20,
              fontWeight: 400
            },
            b: {
              fontFamily: 'PingFangSC-Medium',
              fontSize: 20,
              color: '#333',
              letterSpacing: 0,
              textAlign: 'center',
              lineHeight: 30,
              fontWeight: 500
            },
            x: {
              fontSize: 18,
              fontFamily: 'Microsoft YaHei',
              borderColor: '#449933',
              borderRadius: 4
            }
          }
        }
      },
      labelLine: {
        show: false
      },
      data: [
        { value: 1048, name: 'Search Engine' },
        { value: 735, name: 'Direct' },
        { value: 580, name: 'Email' },
        { value: 484, name: 'Union Ads' },
        { value: 300, name: 'Video Ads' }
      ]
    },
    {
      name: '外边框',
      type: 'pie',
      clockWise: false,
      radius: ['32%', '32%'], //边框大小
      center: ['50%', '50%'], //边框位置
      data: [
        {
          value: 10,
          itemStyle: {
            normal: {
              borderWidth: 8, //设置边框粗细
              borderColor: '#eee' //边框颜色
            }
          }
        }
      ]
    },
    {
      //显示中间的数据
      name: 'Access From',
      type: 'pie',
      radius: ['35%', '60%'], //可以设置圆环的宽度
      avoidLabelOverlap: false,
      itemStyle: {
        borderColor: '#fff',
        borderWidth: 2
      },
      label: {
        show: false,
        formatter: '{d}%',
        position: 'center',
        fontSize: 11,
        color: '#999'
      },
      emphasis: {
        label: {
          show: true,
          formatter: ['{a|{b}}', '{b|{c}}'].join('\n'),
          rich: {
            a: {
              fontFamily: 'PingFangSC-Regular',
              fontSize: 11,
              color: '#999',
              textAlign: 'center',
              lineHeight: 20,
              fontWeight: 400
            },
            b: {
              fontFamily: 'PingFangSC-Medium',
              fontSize: 20,
              color: '#333',
              letterSpacing: 0,
              textAlign: 'center',
              lineHeight: 30,
              fontWeight: 500
            },
            x: {
              fontSize: 18,
              fontFamily: 'Microsoft YaHei',
              borderColor: '#449933',
              borderRadius: 4
            }
          }
        }
      },
      labelLine: {
        show: false
      },
      data: [
        { value: 1048, name: 'Search Engine' },
        { value: 735, name: 'Direct' },
        { value: 580, name: 'Email' },
        { value: 484, name: 'Union Ads' },
        { value: 300, name: 'Video Ads' }
      ]
    }
  ]
};
双纵轴多数据面积图

效果图:
在这里插入图片描述
代码:

option = {
  // 提示窗
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'shadow'
    }
  },
  legend: {
    data: ['发电量', '供电气耗']
  },
  xAxis: {
    type: 'category',
    axisTick: {
      show: false //x轴刻度尺
    },
    axisLine: {
      show: false, //x轴刻度尺
      //x轴线条颜色
      lineStyle: {
        color: '#999'
      }
    },
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: [
    {
      type: 'value',
      name: '万kwh',
      position: 'left',
      splitLine: {
        lineStyle: {
          color: '#EFEFEF' //网格线颜色
        }
      },
      axisLine: {
        show: false //y轴线条
      }
    },
    {
      type: 'value',
      name: 'Nm3/kwh',
      position: 'right',
      splitLine: {
        lineStyle: {
          color: '#EFEFEF' //网格线颜色
        }
      },
      axisLine: {
        show: false //y轴线条
      }
    }
  ],
  series: [
    {
      type: 'line',
      name: '发电量',
      data: [820, 932, 901, 934, 524, 754, 142],
      smooth: true, //面积图改成弧形状
      lineStyle: {
        width: 1, //外边线宽度
        color: '#377AFA' //外边线颜色
      },
      showSymbol: false, //去除面积图节点圆
      areaStyle: {
        //区域填充渐变颜色
        color: {
          type: 'linear',
          x: 0,
          y: 0,
          x2: 0,
          y2: 1,
          colorStops: [
            {
              offset: 0,
              color: 'rgba(91,143,249,0.20)' // 0% 处的颜色
            },
            {
              offset: 1,
              color: 'rgba(91,143,249,0.00)' // 100% 处的颜色
            }
          ],
          global: false // 缺省为 false
        }
      }
    },
    {
      name: '供电气耗',
      type: 'line',
      yAxisIndex: 1,
      data: [154, 565, 756, 934, 248, 788, 1320],
      smooth: true, //面积图改成弧形状
      lineStyle: {
        width: 1, //外边线宽度
        color: '#35C724' //外边线颜色
      },
      showSymbol: false, //去除面积图节点圆
      areaStyle: {
        //区域填充渐变颜色
        color: {
          type: 'linear',
          x: 0,
          y: 0,
          x2: 0,
          y2: 1,
          colorStops: [
            {
              offset: 0,
              color: 'rgba(221,243,215, 0.5)' // 0% 处的颜色
            },
            {
              offset: 1,
              color: 'rgba(250,252,252, 1)' // 100% 处的颜色
            }
          ],
          global: false // 缺省为 false
        }
      }
    }
  ]
};
折柱混合图

效果图:
在这里插入图片描述
代码:

option = {
  color: ['#2078F7 ', '#04C591 ', '#FFB202 '],
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'cross',
      crossStyle: {
        color: '#999'
      }
    }
  },
  legend: {
    left: 'right',
    data: ['计划电量', '实际电量', '出清电价']
  },
  xAxis: [
    {
      type: 'category',
      axisTick: {
        show: false //x轴刻度尺
      },
      axisLine: {
        show: false, //x轴刻度尺
        //x轴线条颜色
        lineStyle: {
          color: '#999'
        }
      },
      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
      axisPointer: {
        type: 'shadow'
      }
    }
  ],
  yAxis: [
    {
      type: 'value',
      name: 'MW',
      axisLabel: {
        formatter: '{value}'
      },
      splitLine: {
        lineStyle: {
          color: '#EFEFEF' //网格线颜色
        }
      },
      axisLine: {
        show: false //y轴线条
      }
    },
    {
      type: 'value',
      name: '元',
      axisLabel: {
        formatter: '{value}'
      },
      splitLine: {
        show: false,
        lineStyle: {
          color: '#EFEFEF' //网格线颜色
        }
      },
      axisLine: {
        show: false //y轴线条
      }
    }
  ],
  series: [
    {
      name: '计划电量',
      type: 'bar',
      barWidth: 8, // 设置柱状图的宽度
      itemStyle: {
        borderRadius: [5, 5, 5, 5] // 分别表示左上、右上、右下、左下四个角的半径大小
      },
      tooltip: {
        valueFormatter: function (value) {
          return value + ' ml';
        }
      },
      data: [
        2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3
      ]
    },
    {
      name: '实际电量',
      type: 'bar',
      barWidth: 8, // 设置柱状图的宽度
      itemStyle: {
        borderRadius: [5, 5, 5, 5] // 分别表示左上、右上、右下、左下四个角的半径大小
      },
      tooltip: {
        valueFormatter: function (value) {
          return value + ' ml';
        }
      },
      data: [
        2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3
      ]
    },
    {
      name: '出清电价',
      type: 'line',
      yAxisIndex: 1,

      tooltip: {
        valueFormatter: function (value) {
          return value + ' °C';
        }
      },
      data: [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2]
    }
  ]
};
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>
    <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.1/echarts.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/echarts-gl/2.0.8/echarts-gl.js"></script>
</head>

<body>
    <div id="echarts-bt" style="width: 375px; height: 300px;"></div>
</body>

<script>
    init();
    //3D饼图 - 1
    function init() {
        //初始化,根据自己项目进行初始化
        var chartDom = document.getElementById('echarts-bt');
        var myChart = echarts.init(chartDom);

        let boxHeight
        let legendData = [];
        let legendBfb = [];

        function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h) {
            // 计算
            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) * h * .1;
                    }
                    return Math.sin(v) > 0 ? 1 * h * .1 : -1;
                }
            };
        }

        // 生成模拟 3D 饼图的配置项
        function getPie3D(pieData, internalDiameterRatio) {
            //internalDiameterRatio:透明的空心占比
            let series = [];
            let sumValue = 0;
            let startValue = 0;
            let endValue = 0;

            let k = 1 - internalDiameterRatio;
            pieData.sort((a, b) => {
                return (b.value - a.value);
            });
            // 为每一个饼图数据,生成一个 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
                    },
                    center: ['10%', '50%'],
                };

                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,也就是实现每一个扇形。
            legendData = [];
            legendBfb = [];
            for (let i = 0; i < series.length; i++) {
                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,
                    series[i].pieData.value    // 控制各模块高度一致100   控制各模块高度根据value改变 
                );
                startValue = endValue;
                const bfb = fomatFloat(series[i].pieData.value / sumValue, 4)
                legendData.push({
                    name: series[i].name,
                    value: bfb
                });
                legendBfb.push({
                    name: series[i].name,
                    value: bfb
                });
            }
            boxHeight = getHeight3D(series, 26);//通过传参设定3d饼/环的高度,26代表26px
            return series

        }

        function fomatFloat(num, n) {
            var f = parseFloat(num);
            if (isNaN(f)) {
                return false;
            }
            f = Math.round(num * Math.pow(10, n)) / Math.pow(10, n);
            var s = f.toString();
            var rs = s.indexOf('.');

            //判定如果是整数,增加小数点再补0
            if (rs < 0) {
                rs = s.length;
                s += '.';
            }
            while (s.length <= rs + n) {
                s += '0';
            }

            return s;
        }

        //获取3d饼图的最高扇区的高度
        function getHeight3D(series, height) {
            series.sort((a, b) => {
                return (b.pieData.value - a.pieData.value);
            })
            return height * 25 / series[0].pieData.value;
        }


        let optionData = [{
            name: '一般违章',
            value: 15,
            itemStyle: {
                color: '#42ABFD',
            }
        }, {
            name: '较严重违章',
            value: 27,
            itemStyle: {
                color: '#FFC96B'
            }
        }, {
            name: '严重违章',
            value: 15,
            itemStyle: {
                color: '#FF90A1'
            }
        }]
        const series = getPie3D(optionData, 0.59);

        //重新绘一个2D的饼图显示连接线及数据
        series.push({
            name: 'pie2d',
            type: 'pie',
            label: {
                opacity: 1,
                fontSize: 13,
                lineHeight: 20,
            },
            labelLine: {
                length: 10,
                length2: 20
            },
            startAngle: -20, //起始角度,支持范围[0, 360]。
            clockwise: false,//饼图的扇区是否是顺时针排布。上述这两项配置主要是为了对齐3d的样式
            radius: ['10%', '52%'],
            data: optionData,
            itemStyle: {
                opacity: 0
            }
        });

        optionData.forEach((item, index) => {
            item.label = {
                color: '#333',
                show: true,
                formatter: '{b|{b}{c} \n}{c|{d}%}',
                rich: {
                    b: {
                        fontSize: 11,
                        lineHeight: 16
                    },
                    c: {
                        fontSize: 11,
                    },
                },
            };
        })

        // 准备待返回的配置项,把准备好的 legendData、series 传入。
        let option = {
            backgroundColor: '#fff',
            legend: {
                data: legendData,
                bottom: 0,
                itemWidth: 6,
                textStyle: {
                    color: '#333',
                },
                show: true,
                icon: "circle",
            },
            xAxis3D: {
                min: -1,
                max: 1
            },
            yAxis3D: {
                min: -1,
                max: 1
            },
            zAxis3D: {
                min: -1,
                max: 1
            },
            grid3D: {
                show: false,
                boxHeight: boxHeight, //圆环的高度
                viewControl: { //3d效果可以放大、旋转等,请自己去查看官方配置
                    alpha: 40, //角度
                    distance: 240,//调整视角到主体的距离,类似调整zoom
                    rotateSensitivity: 0, //设置为0无法旋转
                    zoomSensitivity: 0, //设置为0无法缩放
                    panSensitivity: 0, //设置为0无法平移
                    autoRotate: false //自动旋转
                }
            },
            series: series
        };
        myChart.setOption(option, true);
    }
</script>

</html>
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>
    <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.1/echarts.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/echarts-gl/2.0.8/echarts-gl.js"></script>
</head>

<body>
    <div id="echarts-bt" style="width: 375px; height: 300px;"></div>
</body>

<script>
    let optionData = [{
        name: '一般违章',
        value: 15,
        itemStyle: {
            color: '#42ABFD',
        }
    }, {
        name: '较严重违章',
        value: 27,
        itemStyle: {
            color: '#FFC96B'
        }
    }, {
        name: '严重违章',
        value: 15,
        itemStyle: {
            color: '#FF90A1'
        }
    }]
    mastery(optionData);

    //3D饼图 - 1
    function mastery(data) {
        var myChart = echarts.init(document.getElementById('echarts-bt'));
        var color = ["#42ABFD", "#FFC96B", "#FF90A1"]
        var data = data
        data.forEach((item, index) => {
            item.itemStyle = {
                color: color[index],
                opacity: 1,
            }
        })

        function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h) {
            // 计算
            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 = 1

            // 计算选中效果分别在 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) * h * 0.1;
                    }
                    return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;
                },
            };
        }

        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,
                    value: typeof pieData[i].value === 'undefined' ? `series${i}` : pieData[i].value,
                    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;
                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);
            }

            // 补充一个透明的圆环,用于支撑高亮功能的近似实现。
            series.push({
                name: 'mouseoutSeries',
                type: 'surface',
                parametric: true,
                wireframe: {
                    show: false,
                },
                itemStyle: {
                    opacity: 0,
                },
                parametricEquation: {
                    u: {
                        min: 0,
                        max: Math.PI * 2,
                        step: Math.PI / 20,
                    },
                    v: {
                        min: 0,
                        max: Math.PI,
                        step: Math.PI / 20,
                    },
                    x: function (u, v) {
                        return Math.sin(v) * Math.sin(u) + Math.sin(u);
                    },
                    y: function (u, v) {
                        return Math.sin(v) * Math.cos(u) + Math.cos(u);
                    },
                    z: function (u, v) {
                        return Math.cos(v) > 0 ? 0.1 : -0.1;
                    },
                },
            }, {
                name: 'pie2d',
                type: 'pie',
                labelLine: {
                    length: 20,
                    length2: 30,
                },
                startAngle: -30, //起始角度,支持范围[0, 360]。
                clockwise: false, //饼图的扇区是否是顺时针排布。上述这两项配置主要是为了对齐3d的样式
                radius: ['40%', '40%'],
                center: ['50%', '50%'], //指示线的位置
                data: data,
                itemStyle: {
                    opacity: 0,
                },
            });

            // 准备待返回的配置项,把准备好的 legendData、series 传入。
            let option = {
                label: {
                    color: '#333',
                    show: true,
                    formatter: '{b|{b}{c} \n}{c|{d}%}',
                    rich: {
                        b: {
                            fontSize: 11,
                            lineHeight: 16
                        },
                        c: {
                            fontSize: 11,
                        },
                    },

                },
                xAxis3D: {
                    min: -1,
                    max: 1,
                },
                yAxis3D: {
                    min: -1,
                    max: 1,
                },
                zAxis3D: {
                    min: -1,
                    max: 1,
                },
                grid3D: {
                    show: false,
                    boxHeight: 30,
                    viewControl: {
                        //3d效果可以放大、旋转等,请自己去查看官方配置
                        alpha: 40,
                        beta: 40,
                        distance: 500,
                        rotateSensitivity: 0,
                        zoomSensitivity: 0,
                        panSensitivity: 0,
                        autoRotate: false,
                    }
                },
                series: series,
            };
            return option;
        }

        option = getPie3D(data, 0.71);
        if (option && typeof option === 'object') {
            myChart.setOption(option)
        }
    }
</script>

</html>
参考文章
  1. echarts 立体图
  2. 记录下echarts立体柱形图实现的几种方式
  3. echarts-3D立体饼图(1)
  4. echarts 实现圆柱体柱形图效果
  5. 【ECharts】环形图、饼状图
  6. echarts面积图颜色渐变的实现
  7. echarts怎么设置双纵坐标并且可以缩放,自适应浏览器
  8. echarts-3D立体饼图(2)
  9. echarts3d饼图,环形图(包含透明效果)
  10. echarts 实现3D饼图
  11. Echarts 3D饼图开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/291786.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c jpeg 编码解码验证数据

1. yuv420p 1616 像素点 384字节全部数据 把上面的384个char从左到右&#xff0c;从上到下的顺序输入文件&#xff0c;就能显示红绿蓝白4个水平条

SwiftUI之深入解析ContentUnavailableView的实战应用

一、基本用法 SwiftUI 引入了新的 ContentUnavailableView 类型&#xff0c;允许在应用程序中展示空状态、错误状态或任何其他内容不可用的状态。那么&#xff0c;如何使用 ContentUnavailableView 引导用户浏览应用程序中的空状态呢&#xff1f;首先看看 ContentUnavailableV…

python中的selenium安装的步骤(浏览器自动化测试框架)

一、前言 我们今天要安装的selenium 就是浏览器自动化测试框架&#xff0c;是一个用于Web应用程序的测试工具&#xff0c;就是模拟用户操作。支持的浏览器包括Chrome&#xff0c;IE&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Opera等。今天我们以Chrome为例讲…

msvcr120.dll丢失怎样修复,教你msvcr120.dll丢失的解决办法

在使用电脑的过程中出现关于msvcr120.dll丢失的问题&#xff0c;那么出现这样的问题应该怎么解决呢&#xff1f;其实解决的办法也很简单&#xff0c;今天就和大家说说msvcr120.dll丢失怎样修复&#xff0c;同时给大家介绍一些关于msvcr120.dll文件的相关内容&#xff0c;了解ms…

CMake入门教程【核心篇】添加库(add_library)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 基本用法2.STATIC…

python爬虫实现获取招聘信息

使用的python版本&#xff1a; 3.12.1 selenium版本&#xff1a;4.8.0 urllib版本&#xff1a;1.26.18 from selenium import webdriver from selenium.webdriver import ActionChains import timeimport re import xlwt import urllib.parsedef get_html(url):chrome_drive…

将linux的代码上传至gitte,从创建到linux命令详解

目录 1&#xff1a;创建gitte的代码仓库 1&#xff1a;登录gitte网页 https://gitee.com/ 2&#xff1a;点击导航栏的&#xff0b;号 3&#xff1a;点击新建仓库​编辑4&#xff1a;仓库配置 ​编辑5&#xff1a;复制仓库的路径 linux操作系统命令行 1&#xff1a; linux…

Hadoop集群三节点搭建(一)

一、第一台虚拟机准备 确认是可以上网&#xff0c;方便下载文件和工具&#xff0c;使用ping命令测试下 安装工具 net-tool&#xff1a;工具包集合&#xff0c;包含ifconfig等命令&#xff0c;大家可以根据自己需要按需下载 创建普通用户attest&#xff0c;并修改attest用户的密…

MO 2023 年度回顾

PART-ONE 行业态势 随着供需关系的变化&#xff0c;数据库的竞争在经历了 3 年 “百花齐放” 般的发展后&#xff0c;终于在 2023 年进入到了一个相对收拢的阶段。 2023 年&#xff0c;各个数据库厂商间很有默契地在两个方面达成了一致&#xff1a; HTAP 已经成为新一代数据…

YOLO算法入门指南:了解门槛、学习路径及其易学性

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

基于Segformer实现PCB缺陷检测(步骤 + 代码)

导 读 本文主要介绍基于Segformer实现PCB缺陷检测 &#xff0c;并给出步骤和代码。 背景介绍 PCB缺陷检测是电子制造的一个重要方面。利用Segformer等先进模型不仅可以提高准确性&#xff0c;还可以大大减少检测时间。传统方法涉及手动检查&#xff0c;无法扩展且容易出错…

k8s---声明式资源管理(yml文件)

在k8s当中支持两种声明资源的方式&#xff1a; 1、 yaml格式&#xff1a;主要用于和管理资源对象 2、 json格式&#xff1a;主要用于在API接口之间进行消息传递 声明式管理方法(yaml)文件 1、 适合对资源的修改操作 2、 声明式管理依赖于yaml文件&#xff0c;所有的内容都在y…

webapp下没有蓝点解决

解决方法&#xff1a; File->Project Structure 现在就是一个JavaWeb项目了。

WMS仓储管理系统如何优化急料处理流程

在当今快速发展的商业环境中&#xff0c;企业的运营效率和供应链管理面临着前所未有的挑战。尤其在面对急料处理这一环节时&#xff0c;许多企业都感到力不从心。为了满足生产线的连续运作、确保客户订单的及时交付&#xff0c;WMS仓储管理系统的急料处理流程优化成为了关键。本…

(17)Linux的进程阻塞进程程序替换 exec 函数簇

前言&#xff1a;本章我们讲解它的 options 参数。在讲解之前我们需要理解进程阻塞&#xff0c;然后我们重点讲解二进程程序替换&#xff0c;这是本章的重点&#xff0c;然后介绍一个进程替换函数 execl&#xff0c;通过介绍这个函数来打开突破口&#xff0c;引入进程创建的知识…

【解决复杂链式任务,打造全能助手】LangChain 大模型 打造 钢铁侠的全能助理 Jarvis

LangChain 大模型 结合 做 AutoGPT、ChatPDF 思维链 CoTLangChain模型IO&#xff1a;和大模型交互、提示词模版数据连接&#xff1a;从数据的接入、分割&#xff0c;到向量的构建、存储、搜索链&#xff1a;串联和组织&#xff0c;多个语言模型、组件记忆&#xff1a;灵魂伴侣&…

C#中使用 async await TaskCompletionSource<T>实现异步逻辑同步写

Task、async 和 await 是 C# 中用于处理异步编程的关键概念。它们一起构成了异步编程的基础。 Task Task 是表示异步操作的抽象&#xff0c;它属于 System.Threading.Tasks 命名空间。Task 可以表示已经完成的任务、正在运行的任务或者尚未开始的任务。通过 Task&#xff0c;…

算法导论复习——CHP16 贪心算法

定义 每一步都做出当前看来最优的操作。 问题引入——活动选择问题 问题描述 活动选择问题就是对给定的包含n个活动的集合S&#xff0c;在已知每个活动开始时间和结束时间的条件下&#xff0c;从中选出最多可兼容活动的子集合&#xff0c;称为最大兼容活动集合。 不失一般性&a…

【C++入门】C++内存管理

目录 前言 C/C内存分布 C内存管理方式 1. new和delete操作内置类型 快速了解与使用 2. new和delete操作自定义类型 3. operator new与operator delete 4. operator new [ ] *5.定位new 6. malloc/free和new/delete的区别 总结 前言 C作为一种面向对象的编程语言&#xff…

AI:110-基于深度学习的药物分子结构生成与预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…