vue3+echarts实现渐变色环形图

实现的效果大致是这样,由于是公司的项目,指引线后标注的内容不展示了,大致是指引线上方是name,下边是value+单位

1.定义图表容器

<div class="chart" ref="chartRef" style="width: 610px; height: 260px;"></div>

2.我这边所需要的数据形式大概是:

const data = {
    equmentStatusEchart: [
    {name: '标题1', value: 10}
    {name: '标题2', value: 10}
    ]
}

通过接口拿到的数据类型一般是:[{} ,{}]这种类型的,写一个方法将其转变为我所需要的形式

const convertArrayToObject = (array) => {
  const convertedObject = {
    equmentStatusEchart: array.map(item => ({
      name: item.name,
      value: item.value
    }))
  };
  return convertedObject;
};

具体的代码如下:将接口转换成自己的就好了,我这个是随机生成的颜色渐变,如果有需求可以固定一个颜色数组

import * as echarts from 'echarts';
import { ref, onMounted, nextTick } from 'vue';
import { getPersonnel } from '@/api'
const chartRef = ref(null)
//重点人员
const rangArr = ref([]);
const distribution = ref([])
const distributionList = ref([])
const deflag = ref(1)
const angleArr = ref({})
const data = ref([])
//转换成所需对象数组
const convertArrayToObject = (array) => {
  const convertedObject = {
    equmentStatusEchart: array.map(item => ({
      name: item.communityName,
      value: item.countSum,
      communityId: item.communityId
    }))
  };
  return convertedObject;
};
function getCoordinates(startArc, endArc) {
    const posi = [
      Math.sin(startArc),
      -Math.cos(startArc),
      Math.sin(endArc),
      -Math.cos(endArc)
    ];
    const dx = posi[2] - posi[0];
    const dy = posi[3] - posi[1];

    return getLocation(dx, dy);
  }

  function getLocation(dx, dy) {
    const tanV = dx / dy;
    const directSign = Math.abs(tanV) < 1;
    const t = directSign ? tanV : 1 / tanV;

    const sign1 = t > 0 ? 1 : -1;
    const sign2 = dx > 0 ? 1 : -1;
    const sign = directSign ? sign1 * sign2 : sign2;

    const group1 = [0.5 - sign * t / 2, 0.5 + sign * t / 2];
    const group2 = sign > 0 ? [0, 1] : [1, 0];
    const group = [...group1, ...group2];
    const keys = directSign ? ['x', 'x2', 'y', 'y2'] : ['y', 'y2', 'x', 'x2'];

    let res = {};
    keys.forEach((k, idx) => {
      res[k] = group[idx];
    });
    return res;
  }
const getPersonnelList = async() => {
  distribution.value = await getPersonnel(deflag.value)
  distributionList.value = distribution.value.data
  const obj = convertArrayToObject(distributionList.value)
  console.log(obj)
  const totalValue = ref(obj.equmentStatusEchart.reduce((total, value) => total + value.value, 0));
  let cacheNum = 0;
  for (let i = 0; i < obj.equmentStatusEchart.length; i++) {
    const endNum = cacheNum + obj.equmentStatusEchart[i].value;
    rangArr.value.push([cacheNum, endNum]);
    cacheNum = endNum;
  }
  const angleArr = ref(rangArr.value.map(arr => arr.map(num => (num / totalValue.value) * Math.PI * 2)));
  data.value = obj.equmentStatusEchart.map((item, index) => {
    const range = getCoordinates(angleArr.value[index][0], angleArr.value[index][1]);
    const startColor = `rgb(${Math.floor(Math.random() * 256)}, ${Math.floor(Math.random() * 256)}, ${Math.floor(Math.random() * 256)})`;
    const color = {
      type: 'linear',
      x: range.x,
      x2: range.x2,
      y: range.y,
      y2: range.y2,
      colorStops: [{
        offset: 0, color: startColor // 起始颜色
      }, {
        offset: 1, color: `${startColor.substring(0, startColor.length - 1)}, 0)` // 终点颜色
      }],
      global: false
    };

    return {
      name: item.name,
      value: item.value,
      itemStyle: {
        color: color
      }
    };
  })
}
 
  const getChart = async() => {
    await getPersonnelList()
    const option = {
      tooltip: {
        trigger: 'item',
        backgroundColor: 'rgba(0, 0 , 0, .6)',
        borderColor: "rgba(147, 235, 248, .8)",
        textStyle: {
          color: "#fff"
        },
      },
      series: [
        {
          type: 'pie',
          radius: ['65%', '75%'],
          center: ['50%', '50%'],
          avoidLabelOverlap: false,
          itemStyle: {
          },
          label: {
            show: true,
            position: 'outer',
            align: 'left',
            height: 50,
            lineHeight: 10,
            formatter: function(params) {
            return (
              '{a|' + params.data.name + '}\n' +
              '{b|' + params.data.value  + ' } ' +
              '{value| 人}'
            );
            },
            borderWidth: 10,
            padding: [0, -60],
            rich: {
            a: {
              fontSize: 14,
              color: '#fff',
              fontWeight: 400,
              lineHeight: 35
            },
            b: {
              color: '#fff', 
              fontSize: 18,
              fontWeight: 600,
              lineHeight: 10
            },
            value: {
              color: '#fff',
              fontSize: 14,
              fontWeight: 400,
            }
          }
          },
        labelLine: {
          show: true,
          length: 20,
          length2: 160,
          smooth: 0,
          lineStyle: {
            color: 'white'
          }
        },
          emphasis: {
            itemStyle:{
              shadowBlur: 10,
              shadowOffsetX: 0,
              shadowColor: 'rgba(0, 0, 0, 0.2)'
            }
          },
          data: data.value
        },

      ],
    };
    nextTick(() => {
      const chartDom = chartRef.value;
      const myChart = echarts.init(chartDom);
      myChart.setOption(option)
    })
  }


onMounted(() => {
  getChart()
  
})

  • 13
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3是一种流行的JavaScript框架,而Echarts5是一种强大的数据可视化库。结合Vue3和Echarts5,可以很容易地实现世界地的可视化效果。 首先,你需要在Vue项目中安装Echarts5。可以通过npm或yarn来安装echarts: ``` npm install echarts ``` 或者 ``` yarn add echarts ``` 安装完成后,你可以在Vue组件中引入Echarts,并使用它来绘制世界地。 在Vue组件中,你可以使用`<template>`标签来定义HTML模板,使用`<script>`标签来编写JavaScript代码,使用`<style>`标签来定义CSS样式。 下面是一个简单的示例代码,展示了如何在Vue3中使用Echarts5绘制世界地: ```vue <template> <div id="world-map" style="width: 100%; height: 400px;"></div> </template> <script> import * as echarts from 'echarts'; export default { mounted() { this.drawWorldMap(); }, methods: { drawWorldMap() { const chartDom = document.getElementById('world-map'); const myChart = echarts.init(chartDom); // 定义地数据 const mapData = [ { name: 'China', value: 100 }, { name: 'United States', value: 50 }, // 其他国家... ]; // 配置地选项 const option = { tooltip: { trigger: 'item', formatter: '{b}: {c}', }, visualMap: { min: 0, max: 100, left: 'left', top: 'bottom', text: ['High', 'Low'], seriesIndex: [1], inRange: { color: ['#e0ffff', '#006edd'], }, }, series: [ { type: 'map', mapType: 'world', roam: true, label: { show: true, }, data: mapData, }, ], }; // 使用配置项绘制地 myChart.setOption(option); }, }, }; </script> <style> #world-map { width: 100%; height: 400px; } </style> ``` 在上面的代码中,我们首先引入了Echarts库,然后在`mounted`生命周期钩子函数中调用`drawWorldMap`方法来绘制地。`drawWorldMap`方法中,我们使用`echarts.init`方法初始化一个Echarts实例,并通过配置项`option`来定义地的样式和数据。最后,使用`myChart.setOption(option)`方法将配置项应用到地上。 这样,你就可以在Vue项目中使用Vue3和Echarts5来实现世界地的可视化效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值