网络编程
位置:首页>> 网络编程>> JavaScript>> 利用Echarts如何实现多段圆环图

利用Echarts如何实现多段圆环图

作者:NorthMaple  发布时间:2024-04-28 09:36:22 

标签:echarts,圆环图

前言

开发某款app时,产品给的UI原型图上有个分为三段的圆环图,本来以为使用echarts应该会很好做的,主要考虑移动端echarts的兼容问题就好了,但是实际操作后发现还是没法做到完美的还原,最终找了很多类似的案例,加上自己的一些调整实现了.

原型示例

利用Echarts如何实现多段圆环图

第一眼看的时候以为用echarts里的饼图做一些修改可以达到,但是效果都不太好,首先是每段弧段的边缘有一个圆角的处理,其次是弧度的宽度是不同,灰色最细,红色次之,绿色是最宽的.

第二时间又看到了一些圆环进度条的示例

利用Echarts如何实现多段圆环图

本来以为这种图应该可以实现了,但去看了示例的代码发现这种图是echarts里的pie组件的一个叠加,一般叠加一次,有两个区域效果还算可以,但是3个区域的效果在不设置圆弧的宽度时还算可以接受,但是设置了宽度后总会有一些叠加后超出不太美观的问题.

完美实现

最终在玫瑰图的网站上找到一个比较复杂的实现,通过修改各项配置基本完美的使用ehcarts实现了这个图形. 首先是echarts的一个option的配置代码,为了方便将series与option做了一个分离

const colorDataHandle = (data, total, width = 375) => {
   let num = 0
   let option = {
       angleAxis: {
           axisLine: {
show: false,
           },
           axisLabel: {
show: false,
           },
           splitLine: {
show: false,
           },
           axisTick: {
show: false,
           },
           min: 'dataMin',
           max: 'dataMax',
           startAngle: 135,
           },
           radiusAxis: {
               type: 'category',
               axisLine: {
                   show: false,
           },
           axisTick: {
               show: false,
           },
           axisLabel: {
               show: false,
           },
       },
       polar: {
           radius: '95%'
       },
       series: []
     }
     // option是对传入的数据的一个处理
     const options = data.map((item, index) => {
       num += item
       const a = {
         type: 'bar',
         data: [0, 0, 0, num],
         coordinateSystem: 'polar',
         z: 9999 - index,
         roundCap: true,
         color: colors[index],
         barGap: '-100%',
         // barWidth: '30%',
         itemStyle: {
           // 控制弧的宽,弧的宽的控制并没有做太多的情况判断,简单的区分了一下
           borderWidth: index === 0 ? 4 : index === 1 ? 2 : 0,
           // shadowBlur: 5,
           // color: 'transparent',
           borderColor: colors[index],
           shadowColor: colors[index],
         },
       }
       return a
     })
           option.series = options
     return option
}

然后是对3种颜色区域的一个处理

const colors = [
 {
   type: 'linear',
   x: 0,
   y: 0,
   x2: 0,
   y2: 1,
   colorStops: [
     {
       offset: 0,
       color: '#1DBC3F', // 0% 处的颜色
     },
     {
       offset: 1,
       color: '#1DBC3F', // 100% 处的颜色
     },
   ],
 },
 {
   type: 'linear',
   x: 0,
   y: 0,
   x2: 0,
   y2: 1,
   colorStops: [
     {
       offset: 0,
       color: '#CB3939', // 0% 处的颜色
     },
     {
       offset: 1,
       color: '#CB3939', // 100% 处的颜色
     },
   ],
 },
 {
   type: 'linear',
   x: 0,
   y: 0,
   x2: 0,
   y2: 1,
   colorStops: [
     {
       offset: 0,
       color: '#C0C0C0', // 0% 处的颜色
     },
     {
       offset: 1,
       color: '#C0C0C0', // 100% 处的颜色
     },
   ],
 },
];

这里是灵活使用了echarts type为linear的组件,具体的一个配置项是怎么实现我并没有深入探究.

效果图

最终实现的一个效果图在真机上的展示

利用Echarts如何实现多段圆环图

利用Echarts如何实现多段圆环图

既保证了每段弧的首尾的圆角的问题,也实现了每段弧宽的增加

来源:https://juejin.cn/post/7070127155778158628

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com