echarts+vue气泡图实践

今天使用echarts画气泡图,但是我这次我画的气泡图有一定的要求,网上没有完全满足我的要求的。气泡要求重叠,气泡有最大和最小直径,尽量不要遮挡文字。气泡的位置是固定的,只是气泡大小会发生变化。大概是这样一个图,如下:

今天在一个vue项目中大致实现要求。去echarts官网找灵感,下面这两个可以参考一下。那么开始做吧!

一、vue项目引入echarts并初始化

1.1新建一个vue项目

参考 vue官网

1.2引入

参考 echarts官网npm install echarts --save安装包。 在vue项目下建立一个bubble.vue文件

1.3初始化

根据教程,将代码选择性复制到自己的vue文件中。

代码如下:

js 复制代码
<template>
  <div id="main"></div>
</template>

<script>
import * as echarts from "echarts";
export default {
  mounted() {
    var myChart = echarts.init(document.getElementById("main"));
    myChart.setOption({
      title: {
        text: "ECharts 入门示例",
      },
      tooltip: {},
      xAxis: {
        data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
      },
      yAxis: {},
      series: [
        {
          name: "销量",
          type: "bar",
          data: [5, 20, 36, 10, 10, 20],
        },
      ],
    });
  },
};
</script>
<style scoped >
#main{
    width: 500px;
    height: 500px;
}
</style>

启动服务,打开浏览器,可以看到图表正确展示了。

二、绘制气泡图

找到要参考的echarts实例,复制代码到vue项目中。

启动成功。

对代码进行一定的修改,删除data中多的数据,原图只有两种颜色,在data中加一个数组。经过一定的修改后,得到新的data,在这样[25, 30, 200, "cc", 3]的一组数据中,分别代表气泡的x轴位置,y轴位置,大小,name

js 复制代码
 const data = [
      [[25, 30, 200, "cc"]],
      [[10, 20, 200, "aa"]],
      [[30, 15, 200, "bb"]],
 ];

修改了一下option,如下

js 复制代码
myChart.setOption({
      grid: {
        left: "25%",
        top: "25%",
        bottom: "30%",
        right: "25%",
      },
      xAxis: {
        show: false,
        splitLine: false,
      },
      yAxis: {
        show: false,
        splitLine: false,
        // scale: true,
      },
      series: [
        {
          name: "1",
          data: data[0],
          type: "scatter",
          symbolSize: function (data) {
            return data[2];
          },
          label: {
            show: true,
            color: "#FFF",
            formatter: function (param) {
              return param.data[3];
            },
            position: "inside",
          },
          itemStyle: {
            shadowBlur: 10,
            shadowColor: "rgba(120, 36, 50, 0.5)",
            shadowOffsetY: 5,
            color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [
              {
                offset: 0,
                color: "rgb(251, 118, 123)",
              },
              {
                offset: 1,
                color: "rgb(204, 46, 72)",
              },
            ]),
          },
        },
        {
          name: "2",
          data: data[1],
          type: "scatter",
          symbolSize: function (data) {
            return data[2];
          },
          label: {
            show: true,
            color: "#FFF",
            formatter: function (param) {
              return param.data[3];
            },
            position: "inside",
          },
          itemStyle: {
            shadowBlur: 10,
            shadowColor: "rgba(25, 100, 150, 0.5)",
            shadowOffsetY: 5,
            color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [
              {
                offset: 0,
                color: "rgb(129, 227, 238)",
              },
              {
                offset: 1,
                color: "rgb(25, 183, 207)",
              },
            ]),
          },
        },
        {
          name: "2",
          data: data[2],
          type: "scatter",
          symbolSize: function (data) {
            return data[2];
          },
          label: {
            show: true,
            color: "#FFF",
            formatter: function (param) {
              return param.data[3];
            },
            position: "inside",
          },
          itemStyle: {
            shadowBlur: 10,
            shadowColor: "rgba(25, 100, 150, 0.5)",
            shadowOffsetY: 5,
            color: new echarts.graphic.RadialGradient(0.4, 0.5, 1, [
              {
                offset: 0,
                color: "rgb(13, 14, 238)",
              },
              {
                offset: 1,
                color: "rgb(255, 255, 255)",
              },
            ]),
          },
        },
      ],
    });

大概这样一个图。

写一个方法,计算圆形的大小。 目前是这样计算的,圆的范围在200-250之间,写了一个方法,根据比较计算圆的大小。

js 复制代码
 const minWidth = 200;
      const maxWidth = 250;
      const widthRange = maxWidth - minWidth;
      const max = Math.max(this.aa, this.bb, this.cc);
      const min = Math.min(this.aa, this.bb, this.cc);
      const range = max - min;
      console.log(min, max, range);

      let ra = minWidth;
      let rb = minWidth;
      let rc = minWidth;

      if (range != 0) {
        ra = ((this.aa - min) / range) * widthRange + minWidth;
        rb = ((this.bb - min) / range) * widthRange + minWidth;
        rc = ((this.cc - min) / range) * widthRange + minWidth;
      }
       const data = [
        [[25, 30, rc, "cc"]],
        [[10, 20, ra, "aa"]],
        [[30, 15, rb, "bb"]],
      ];

把data里的第三个数据用自己计算的结果替换。然后每次数据变化,重新渲染echarts图表。效果如下图。

大概这样一个效果吧。

相关推荐
随风一样自由2 小时前
【前端领域】2026最新前端领域全梳理(框架/工具/AI/跨端/底层标准/就业趋势)
前端·人工智能·前端框架
这是个栗子2 小时前
【前端性能优化】优化数据加载:用 Promise.all 从串行到并行
前端·javascript·性能优化·异步编程·前端优化·promise.all
fei_sun3 小时前
黑洞路由(Null Route/空接口路由)
服务器·前端·javascript
大爱一家盟3 小时前
告别卡点BGM同质化 2026原创卡点音乐素材下载网站 TOP5 推荐
大数据·前端·人工智能
彦为君3 小时前
算法思维与经典智力题
java·前端·redis·算法
aa小小4 小时前
localhost 访问异常排查笔记
前端
格子软件4 小时前
2026年GEO优化系统源码的分布式状态机深度拆解
java·前端·vue.js·vue·geo
陈随易4 小时前
Rust、Golang、MoonBit 编译成 WASM,体积和速度差距有多大?
前端·后端·程序员
IT_陈寒4 小时前
Python多线程的坑,我居然现在才踩到
前端·人工智能·后端
触底反弹5 小时前
🔥 字符串算法面试三连击:反转、回文、回文变种,搞懂这三题稳了!
前端·javascript·算法