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图表。效果如下图。

大概这样一个效果吧。

相关推荐
莘薪18 分钟前
JQuery -- 第九课
前端·javascript·jquery
好青崧21 分钟前
CSS 样式入门:属性全知晓
前端·css·tensorflow
光头程序员42 分钟前
工程化开发谷歌插件到底有爽
前端·react·工程化·前端工程化·谷歌插件
蒜蓉大猩猩1 小时前
Vue.js --- Vue3中其他组合式API
前端·javascript·vue.js·前端框架·node.js·html
铅华尽1 小时前
前端---HTML(一)
前端
无限大.1 小时前
0基础学前端系列 -- 深入理解 HTML 布局
前端·html
珹洺1 小时前
从 HTML 到 CSS:开启网页样式之旅(开篇之一)——CSS 初体验与网页样式新征程
前端·javascript·css·前端框架·html
前端Hardy1 小时前
HTML&CSS:翻书加载效果
前端·javascript·css·3d·html·css3
问道飞鱼1 小时前
【前端知识】SCSS(Sassy CSS)是一种CSS预处理器语言
前端·css·less·scss
窗边的anini1 小时前
在React中使用SVG的几种方式
前端·react.js·svg