Vue3 ECharts 双间隔环形图的实现

话不多说咱们先看最终效果图

可以看到图中使用空白间隔把环形图表隔开,内部使用同样颜色不同透明度展示。

在这里插入图片描述

一、内环 & 外环

简单说就是在饼图外部实现一个圆环的扩展弧度

因为我们的图表可能存在多个series,即多个环形图,所以我们需要找到最外部的最大环半径,从它开始向外扩展(这个可以扩展到series上,无需再添加一个图表)

实现上和内环其实一样的,只要修改一个radius的显示位置即可,从最大环半径开始向外拓展。

series: [
    // 外环
    {
      padAngle: 5, // 间隔
      center: ["25%", "50%"],
      type: "pie",
      radius: ["65%", "70%"], //修改圆圈大小
      avoidLabelOverlap: false,
      label: {
        show: false //开启提示线文字
      },
      emphasis: {
        scale: false, //鼠标划上不展示高亮放大效果
        label: {
          show: false
        }
      },
      labelLine: {
        show: false
      },
      data: [] // 数据接口获取
    },
    // 内环
    {
      padAngle: 5, // 间隔
      type: "pie",
      center: ["25%", "50%"],
      radius: ["55%", "70%"], //修改圆圈大小
      avoidLabelOverlap: false,
      label: {
        show: false,
        position: "center"
      },
      emphasis: {
        scale: false, //鼠标划上不展示高亮放大效果
        label: {
          show: false
        }
      },
      labelLine: {
        show: false
      },
      data: [] // 数据接口获取
    }
  ]
});

饼图颜色可提前配置好

const colorList = [
    { color: "#FEE186", opacity: 0.2 },
    { color: "#89F3F7", opacity: 0.2 },
    { color: "#FFFFFF", opacity: 0.2 },
    { color: "#628EF6", opacity: 0.2 },
    { color: "#72508D", opacity: 0.2 }
    ....  // 按照需求增加颜色
]

通过接口返回数据

const getPlantAreaInfo = async () => {
  agricProportionValue.series[0].data = [];
  agricProportionValue.series[1].data = [];
  const res = await getPlantArea(); // 模拟接口
  // 拿到数据进行赋值
  res.result.forEach((item: any, index: any) => {
    agricProportionValue.series[0].data.push({
      value: item.area,
      name: item.name,
      itemStyle: { color: colorList[index].color }  // 外环只取颜色即可
    });
    agricProportionValue.series[1].data.push({
      value: item.area,
      name: item.name,
      itemStyle: colorList[index]  // 内环颜色取所有
    });
  });
};

二、圆环内部标题

title: [
    {
      // 第一个圆环标题
      text: "种植面积", // 主标题
      textStyle: {
        // 主标题样式
        color: "#FFFFFF",
        fontWeight: 400,
        fontSize: "18px"
      },
      left: "24%", // 定位到适合的位置
      top: "40%", // 定位到适合的位置
      subtext: "占比", // 副标题
      subtextStyle: {
        // 副标题样式
        color: "#FFFFFF",
        fontSize: "18px",
        fontWeight: 400
      },
      textAlign: "center" // 主、副标题水平居中显示
    }
  ],

三、右侧自定内容

legend: {
    orient: "vertical", // 显示方式 纵向
    right: "0%",
    top: 50,
    itemGap: 15,
    textStyle: {
      color: "#fff",
      fontSize: 15
    }
 },

拿到接口返回数据之后拼接

const res = await getPlantArea(); // 模拟接口
agricProportionValue.legend.formatter = (params: any) => {
    let name = "";
    let area = "";
    let percent = "";
    res.result.forEach((item: any, index: any) => {
      if (params == item.name) {
        name = `${item.name}`;
        area = `${item.area}`;
        percent = `${item.percent}`;
      }
    });

    return `{name|${name}} {area|${area}亩} {percent|${percent}%}`;
  };

四、鼠标悬停显示内容

在这里插入图片描述

 tooltip: {
    trigger: "item",
    color: "#fff",
    backgroundColor: "rgba(0,0,0,.5)", // 自定义背景颜色
    fontSize: 14,
    borderColor: "rgba(255, 255, 255, .16)", // 自定义边框颜色
    textStyle: {
      color: "#fff", // 自定义文字颜色
      fontSize: 14 // 自定义文字大小
    },
    // 自定义内容
    formatter: (params: any) => {
      return `
      <div>${params.name}</div>
      <div>${params.data.value}亩:<span style="color: #09ffd2;font-weight: bold;">${params.percent}</span> %</div>
      `;
    }
  },
Vue3和Echarts3D环形实现可以参考以下步骤: 1. 首先,你需要在你的Vue3项目中安装EchartsEcharts-GL库。你可以使用npm或yarn来安装它们。在你的项目中,你需要在main.js文件中引入EchartsEcharts-GL库,并将它们挂载到Vue的原型上,以便在整个项目中使用。 2. 接下来,你需要在你的组件中引入Echarts组件,并在template中添加一个div元素,用于渲染Echarts表。 3. 在script标签中,你需要定义一个data对象,用于存储Echarts表的配置项和数据。你可以在这里定义环形的半径、颜色、数据等。 4. 在mounted生命周期钩子函数中,你需要使用Echarts的init方法初始化表,并将配置项和数据传递给它。你还需要使用setOption方法设置表的样式和数据。 5. 最后,你需要在组件中使用v-if指令来判断Echarts表是否已经加载完成,如果加载完成,则显示表,否则显示一个加载中的提示。 下面是一个示例代码,供你参考: ``` <template> <div> <div ref="chart" style="width: 100%; height: 400px;"></div> <div v-if="!isLoaded">Loading...</div> </div> </template> <script> import * as echarts from 'echarts' import 'echarts-gl' export default { data() { return { isLoaded: false, chartData: { radius: ['50%', '70%'], color: ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C', '#FF9F7F'], series: [ { type: 'pie', radius: ['50%', '70%'], avoidLabelOverlap: false, label: { show: false, position: 'center' }, emphasis: { label: { show: true, fontSize: '30', fontWeight: 'bold' } }, labelLine: { show: false }, data: [ { value: 335, name: '直接访问' }, { value: 310, name: '邮件营销' }, { value: 234, name: '联盟广告' }, { value: 135, name: '视频广告' }, { value: 1548, name: '搜索引擎' } ] } ] } } }, mounted() { const chart = echarts.init(this.$refs.chart) chart.setOption(this.chartData) chart.on('finished', () => { this.isLoaded = true }) } } </script> <style> </style> --相关问题--:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值