环境 vue+element+echarts

饼图生产项目需求:
1、产生的数据在饼图都有体现,tooltie显示数值,名称,占比等信息,
2、legend分页滚动显示内容,并且鼠标悬浮也显示tooltie信息
3、饼图展示所有的数据占比且展示的顺序按照接口返回的数据顺序展示,但是只有数量前十的会显示label和labelLine
在这里插入图片描述
在这里插入图片描述
只显示前十数据的label,需要自己计算数据

在这里插入图片描述
在这里插入图片描述
其他基本在官方文档中都有记录。
由于没有仔细查找文档导致想要在legend显示tooltie提示信息,查找了很多时间,没在网上找到对应的资源,无奈回到官方文档继续查找。最后找到了解决办法。
在这里插入图片描述
至于在legend悬浮时tooltie信息显示数值和占比,就需要从formmter中拿到名称和数值自己计算了
在这里插入图片描述
贴上代码

initEchartFour(){
  this.$axios.get('/api/common/industrycategory/list').then(res => {//获取行业类型下拉列表
       if(res.data.msg === 'success'){
           if(res.data.data){
               this.orderOptions=[]//id和name维度接口,用来对比获取名称
               this.orderNameArr=[]//legend名称数组

               this.orderOptions=res.data.data
               res.data.data.forEach(item => {
                   this.orderNameArr.push(item.name)
               })
           
               const  myCharts = this.$echarts.init(this.$refs.myChartFour);
               myCharts.showLoading({text: "数据加载中...",textColor:'#7a7878',color:'#57a2ff',lineWidth: 2});            
               let params={//请求参数
                   date_type:this.formLabelAlign.disvalue ? 'm' : 'd',
                   start_time:this.formLabelAlign.disvalue ? this.$moment(this.formLabelAlign.dateStart).format('YYYYMM') : this.$moment(this.formLabelAlign.dateStart).format('YYYYMMDD'),
                   end_time:this.formLabelAlign.disvalue ? this.$moment(this.formLabelAlign.dateEnd).format('YYYYMM') : this.$moment(this.formLabelAlign.dateEnd).format('YYYYMMDD'),
                   user_type:this.formLabelAlign.sarchType
               }
               let seriesArr = []//seirise  data数据
               this.$axios.post('/api/busi/product/v1/product/analyse/industrypercent',{},{
                   params:params,
                   headers:{
                       'Content-Type':'application/x-www-formurlencoded',
                       'usid':store.state.xaiot_token
                   }
               }).then(res => {
                   if(res.data.msg === 'success'){
                       if(res.data.data.length === 0){//无数据自定义样式
                           var html = `<span class="echarts-nodate"><i class="fontFamily yybzzanwushuju1"></i>暂无数据</span>`
                           document.getElementById('myChartFour').innerHTML = html
                           document.getElementById('myChartFour').removeAttribute('_echarts_instance_')
                       }else{
                           let numTotal=0
                           res.data.data.forEach((item,index) => {
                               this.orderOptions.forEach((result,j) => {
                                   if(item.industry === result.code){//code和id相同  存储相关数据
                                       numTotal += item.product_num //记录数据总数用来进行计算占比
                                       seriesArr.push({
                                           value: item.product_num, 
                                           name: result.name,
                                           code:item.industry,
                                           label: {show: false},//默认不显示,后续计算出前十改为true显示
                                           labelLine:{show:false}//默认不显示,后续计算出前十改为true显示
                                       })
                                   }
                               })
                           })
                           let newarr=res.data.data
                           for (let i = 1; i < newarr.length; i++) {//插入排序寻找前十的数据
                               for (let j = i; j > 0; j--) {
                                   if (newarr[j].product_num > newarr[j-1].product_num) {
                                       let pre = newarr[j];
                                       newarr[j] = newarr[j-1];
                                       newarr[j-1] = pre;
                                   };
                               };
                           };
                           newarr.forEach((_opt,_optIndex)=>{//根据自己排序的前十将label和labelLine改为显示
                               if(_optIndex < 10){
                                   seriesArr.forEach((item,index)=>{
                                       if(_opt.industry === item.code){
                                           seriesArr[index].label.show=true
                                           seriesArr[index].labelLine.show=true
                                       }
                                   })
                               }
                           })
                           let options = {
                               title: {
                                   text: '各行业类型产品数量占比',
                                   left: 'center',
                                   textStyle:{
                                           color:'#6B6B6B',
                                           fontSize:18
                                   }
                               },
                               tooltip: {
                                   trigger: 'item',
                                   formatter: '{a} <br/>{b} : {c} ({d}%)',
                                   textStyle:{
                                     align:'left'
                               }
                               },
                               legend: {
                                   type: 'scroll',
                                   // selectedMode:false,//可否点击
                                   // orient: 'vertical',//横纵显示设置
                                   padding:[0,30],
                                   bottom:10,
                                   data: seriesArr,
                                   selected:this.orderNameArr,
                                   tooltip: {
                                       show: true,
                                       trigger: 'item',
                                       formatter: function (tool) {
                                           let indexNum=0
                                           seriesArr.forEach(item => {
                                               if(item.name === tool.name) indexNum = item.value
                                           })
                                           if(indexNum === 0){

                                           }else{
                                               return `类型占比</br>${tool.name}:${indexNum} (${(indexNum/numTotal*100).toFixed(2)}%)`
                                           }
                                       },
                                       textStyle:{
                                         align:'left'
                                   }
                                   },
                                   formatter: function (name) {
                                       return (name.length > 6 ? (name.slice(0, 6) + "...") : name);
                                   }
                               },
                               grid:{
                                   height:600,
                                   left:'80',
                                   right:'80'
                               },
                               series: [
                                   {
                                       name: '类型占比',
                                       type: 'pie',
                                       radius: '55%',
                                       center: ['50%', '50%'],
                                       label: {
                                           normal: {
                                               formatter(v) {
                                                   return (v.name.length > 6 ? (`${v.name.slice(0, 6)}... ${v.percent}%`) : `${v.name} ${v.percent}%`);
                                               }
                                           }
                                       },
                                       labelLine:{
                                           show:false
                                       },
                                       data: seriesArr,
                                       emphasis: {
                                           itemStyle: {
                                               shadowBlur: 10,
                                               shadowOffsetX: 0,
                                               shadowColor: 'rgba(0, 0, 0, 0.5)'
                                           }
                                       }
                                   }
                               ]
                           };
                           myCharts.setOption(options);
                           window.addEventListener('resize',function(){
                               myCharts.resize()
                           })
                       }
                   }  
                   myCharts.hideLoading();
               })
               // .catch(res => {
               //     myCharts.hideLoading();
               //     var html = `<span class="echarts-nodate"><i class="fontFamily yybzzanwushuju1"></i>暂无数据</span>`
               //     document.getElementById('myChartFour').innerHTML = html
               //     document.getElementById('myChartFour').removeAttribute('_echarts_instance_')

               //     console.log('error!')
               // })
           }
       }
   })
},

自定义无数据时显示
在这里插入图片描述

var html = `<span class="echarts-nodate"><i class="fontFamily yybzzanwushuju1"></i>暂无数据</span>`
document.getElementById('myChartFour').innerHTML = html
document.getElementById('myChartFour').removeAttribute('_echarts_instance_')
Logo

前往低代码交流专区

更多推荐