Echarts3D图 / Echart3D饼图

本文档介绍了如何利用Echarts库创建3D饼图,包括安装Echarts、设置参数方程、生成配置选项以及在Vue框架中实现图表的初始化。示例代码展示了从获取数据到渲染3D饼图的完整过程,适用于前端开发者学习和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先在Echarts上或Echarts gallery(现在好像叫makeapie)上找到自己需要的3D图
在这次文章中以下面的饼图作为示例
Echarts饼图示例

使用Echarts前需要先安装Echarts的包

npm install echarts

下载后记得引入并挂载

本文章使用的框架是Vue。
首先将网站里的前两个计算方法复制到methods里

methods: {
    // 生成扇形的曲面参数方程,用于 series-surface.parametricEquation
    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;
            }
        };
        // console.log('getparams');
    },
    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);
          // console.log('get3d');
      }

      // 使用上一次遍历时,计算出的数据和 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 = this.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}`;
                  }
              }
          },
          legend: {
              data: legendData,
              textStyle:{
                  color:'#FFFFFF',
                  fontSize:10
              }
          },
          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;
    }

第三个option是作为配置用的,因此另外写一个方法(用echarts的init方法绑定dom,并初始化),并将方法放在mounted状态中,让页面挂载后启动该方法。

methods: {
	chart() {
      let chart = document.getElementById('chart-talent');
      let mychart = this.$echarts.init(chart);
      let option = getPie3D([{
		    name: '已消除',
		    value: 3,
		    itemStyle: {
		        opacity: 0.5,
		        color:'rgba(0,127,244,.8)',
		    }
			},{
			    name: '未消除',
			    value: 1,
			    itemStyle: {
			        opacity: 0.5,
			        color:'rgba(209,126,23,.8)',
			    }
	  }],2);
      mychart.setOption(option);
    }
},
mounted() {
	this.chart();
}

html部分

<div class="chart" id="chart" style="width=100%;height=100%">

注意事项

  1. 安装Echarts并引入
  2. 将示例的方法复制到methods中,并新建一个用来初始echarts的方法,将该方法挂载到mounted状态中
  3. 在使用的页面中引入echarts3d<script>import 'echarts-gl'</script>;
  4. 给需要挂载的dom设置宽高
要制作一个3D,需要使用ECharts中的graphic组件和pie组件。下面是一个简单的例子: ```javascript // 引入echarts import echarts from 'echarts'; // 初始化echarts let myChart = echarts.init(document.getElementById('chart')); // 定义数据 let data = [ {value: 335, name: '直接访问'}, {value: 310, name: '邮件营销'}, {value: 234, name: '联盟广告'}, {value: 135, name: '视频广告'}, {value: 1548, name: '搜索引擎'} ]; // 定义外部圆环样式 let outerRing = { type: 'ring', shape: { cx: '50%', cy: '50%', r: ['40%', '55%'], width: '30%' }, itemStyle: { borderColor: '#fff', borderWidth: 2 } }; // 定义内部圆环样式 let innerRing = { type: 'ring', shape: { cx: '50%', cy: '50%', r: ['30%', '35%'], width: '30%' }, itemStyle: { borderColor: '#fff', borderWidth: 2 } }; // 定义3D样式 let pie3D = { type: 'pie', radius: ['35%', '50%'], itemStyle: { borderColor: '#fff', borderWidth: 2 }, label: { show: true, position: 'outside', formatter: '{b}: {c} ({d}%)' }, labelLine: { show: true, length: 20, length2: 30, lineStyle: { color: '#333' } } }; // 定义形 let graphic = { type: 'group', children: [ { type: 'text', left: 'center', top: '42%', style: { text: '3D', fill: '#333', fontWeight: 'bold', fontSize: 24 } } ] }; // 定义配置项 let option = { graphic: graphic, series: [ outerRing, innerRing, pie3D ], data: data }; // 设置配置项并渲染表 myChart.setOption(option); ``` 在上面的例子中,我们首先引入了echarts库,并初始化了一个表。然后,我们定义了一些数据和样式,包括外部圆环样式、内部圆环样式和3D样式,最后将它们放在了一个配置项中。在配置项中,我们还定义了一个形,用于在表中显示一个标题。最后,我们将配置项设置给表,并渲染出了一个3D。 请注意,上面的代码仅供参考,您可以根据自己的需求进行修改和定制。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值