Echarts3D图 / Echart3D饼图

首先在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设置宽高
  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值