饼图缝隙和label旋转

描述:当前是关于Echarts图表中的 饼图 示例。
 
            let data = [
   { value: 3048, name: '高圆圆' },
   { value: 900, name: '迪丽热巴' },
   { value: 2048, name: '杨超越' },
   { value: 1048, name: '刘诗诗' },
   { value: 6048, name: '刘亦菲' },
]
// 用的16进制颜色;方便与 外层透明色的修改;
let colors = ['#98EECC', '#FF78C4', '#E4A5FF', '#30A2FF', '#FC4F00'];
let legends = [];
data.map((item, k) => {
   legends.push(item.name);
   item['itemStyle'] = { color: colors[k] }
})
const computedDataGap = (dataParam, isN2 = false) => {
   let newData = [];
   let gapItem = {
      value: 40,  //间隙值;我这里没计算;可以做一个函数根据总数和需要的value计算添加
      name: null,
      itemStyle: {
         opacity: 0
      },
      tooltip: {  //隐藏这个的鼠标悬浮
         show: false,
      },
   }
   let showLen = dataParam.filter((v) => v.value && v.value > 0);
   if (showLen.length <= 1) {
      return dataParam;
   }
   dataParam.map((v, k) => {
      let v_ = v;
      // 用于判断是否是 外城pie的item
      if (isN2) {
         // 计算传入数据的value总和 用于计算2PI对于总数的均值
         let count = dataParam.map((v) => v.value).reduce((a, b) => a + b);
         let pi = Math.PI * 2 / count;

         // 例如leged2 开始的角度需要加上legend1的结束的位置则加上当前的value
         let beforeCount = 0;
         // for 循环i < k 不包含map循环的item
         for (let i = 0; i < k; i++) {
            beforeCount += dataParam[i].value;
         }
         // 结束的
         let afterCount = beforeCount + v.value;

         let endAngle = pi * beforeCount;
         let startAngle = pi * afterCount;
         let angle = (endAngle + startAngle) / 2;
         angle = angle * 180 / Math.PI;
         v_ = {
            ...v,
            itemStyle: {
               color: v.itemStyle.color + '7a'
            },
            label: {
               show: true,
               position: 'inside',
               color: "#000",
               rotate: -angle,
               fontSize: 16,
               color: '#333'
            }
         }
      }
      newData.push(v_)
      if (v.value) {
         newData.push(gapItem)
      }
   })
   return newData;
}
let n = computedDataGap(data);
let n2 = computedDataGap(data, true);
// 最终数据处理结果在这;一眼懂
console.log(n, n2);

option = {
   backgroundColor: "#fff",
   tooltip: {
      trigger: 'item'
   },
   legend: {
      top: '16%',
      left: 'center',
      data: legends
   },
   color: colors,
   series: [
      {
         name: 'Access From',
         type: 'pie',
         radius: ['25%', '30%'],
         // 避免label重叠
         avoidLabelOverlap: false,
         // 占位样式
         emptyCircleStyle: {
            color: 'rgba(255,255,255,0)'
         },
         label: { show: false },
         data: n,
         tooltip: { show: false },
         emphasis: {
            disabled: true
         }
      },
      {
         name: 'Access From',
         type: 'pie',
         radius: ['30%', '50%'],
         // 避免label重叠
         avoidLabelOverlap: false,
         // 占位样式
         emptyCircleStyle: {
            color: 'rgba(255,255,255,0)'
         },
         labelLine: {
            show: false
         },
         label: {  //这里加上用于剩余最后一个占满时的旋转; 在data的label没有时则用这个;且data内的优先级高于此
            show: true,
            position: 'inside',
            color: "#000",
            rotate: 0
         },
         data: n2
      }
   ]
};

myChart.on('legendselectchanged', function (lparam) {
   let selects = lparam.selected;
   let newDataFilter = [];
   data.filter((item) => {
      if (selects[item.name]) {
         newDataFilter.push(item);
      } else {
         let clone = {
            ...item,
            value: 0
         }
         newDataFilter.push(clone)
      }
   })
   let nn = computedDataGap(newDataFilter);
   let nn2 = computedDataGap(newDataFilter, true);
   myChart.setOption({
      series: [
         {
            data: nn
         },
         {
            data: nn2
         }
      ]
   })
   console.log(lparam)
})