SpringBoot+Vue集成echarts图表可视化实现动态数据统计(饼图)

        最近在毕设的过程中,老师要求我们专业的毕业设计要实现与数据分析有关的功能,回顾之前和数据分析有关的课程,觉得能用到的也就是数据可视化,但是怎么把可视化图表放入项目中,网上找了一些项目视频,理解了过程,使用springboot+vue框架的大部分都是使用echarts集成,所以我尝试写下这篇笔记,记录我学习的笔记以及具体的实操过程。

echarts社区链接:Examples - Apache ECharts

1、echarts安装与使用

npm install echarts --save

        打开终端,在vue目录底下进行安装。

        安装后如下所示:

        打开package.json文件查看echarts已安装:

安装成功后在你需要使用的页面引入echarts:

import * as echarts from 'echarts';

2、设计绘制图形

        进入echarts网站,找到自己需要绘制的图表,根据自己的需求对代码进行编辑,来设计图表的样式,里面的数据随意,因为之后会替换成动态的数据,如下图所示:

import * as echarts from 'echarts';

let chartPie = document.getElementById('pie');//页面上要渲染的位置
let pieChart = echarts.init(chartPie );//echarts的初始化
let option;

option = {
  title: {
    text: '商品类别统计(饼图)', //主标题
    subtext: '统计维度:商品分类', //副标题
    left: 'center' //标题的位置,这里设置为 'center',表示标题居中显示。
  },
  tooltip: {
    trigger: 'item' //指定 tooltip 的触发方式,这里设置为 'item',表示当用户悬停在某个数据项上时显示 tooltip。
  },
  legend: {
    orient: 'vertical', //表示图例垂直排列。
    left: 'left' //图例的位置
  },
  color: [
    '#f9f4dc',
    '#f7da94',
    '#619ac3',
    '#ac1f18',
    '#e2d849',
    '#add5a2',
    '#d276a3',
    '#ce5777',
    '#FFB533',
    '#126e82'
  ],
  series: [
    //图表的系列数据
    {
      name: '商品分类', //系列的名称,这里为 '商品分类',用于标识该系列。
      type: 'pie', //图表类型,这里设置为 'pie',表示这是一个饼图。
      radius: '50%', //饼图的半径,这里设置为 '50%',表示饼图占据图表的50%。
      data: [
        { value: 1048, name: '民间文学' },
        { value: 735, name: '传统音乐' },
        { value: 580, name: '传统舞蹈' },
        { value: 484, name: '传统戏剧' },
        { value: 300, name: '曲艺' },
        { value: 1048, name: '传统体育' },
        { value: 735, name: '传统美术' },
        { value: 580, name: '传统技艺' },
        { value: 484, name: '传统医药' },
        { value: 300, name: '民俗 ' }
      ],
      emphasis: {
        //当用户悬停在某个数据项上时的样式设置。
        itemStyle: {
          //设置高亮时的样式。
          shadowBlur: 10, //阴影模糊度。
          shadowOffsetX: 0, //阴影的水平偏移量。
          shadowColor: 'rgba(0, 0, 0, 0.5)' //阴影的颜色。
        }
      }
    }
  ]
};

option && myChart.setOption(option);

         分析饼图所需要的数据,是一个list列表,里面包含了很多Map类型的数据。饼图只需要替换其中的data数据即可。

        总结饼图的绘制,只需要在后台写一个接口,去查询需要统计模块的所有数据,然后在后台的处理逻辑里根据统计的维度按照data所需要的数据结构封装在一个list里并返回前端赋值给data。

3、测试图形效果

①在需要绘制的页面导入echarts:

<script>
import * as echarts from 'echarts';
</script>

②添加一个区域来绘制饼图

<div style="width: 50%">
      <div id="bie" style="width: 100%;height: 400px"></div>
</div>

③定义绘制饼图函数initPie()

methods:{
    initPie() {
      let chartDomPie = document.getElementById('pie');
      let PieChart = echarts.init(chartDomPie);
      let option;

      option = {
        title: {
          text: '商品类别统计(饼图)', //主标题
          subtext: '统计维度:商品分类', //副标题
          left: 'center' //标题的位置,这里设置为 'center',表示标题居中显示。
        },
        tooltip: {
          trigger: 'item' //指定 tooltip 的触发方式,这里设置为 'item',表示当用户悬停在某个数据项上时显示 tooltip。
        },
        legend: {
          orient: 'vertical', //表示图例垂直排列。
          left: 'left' //图例的位置
        },
        color: [
          '#f9f4dc',
          '#f7da94',
          '#619ac3',
          '#ac1f18',
          '#e2d849',
          '#add5a2',
          '#d276a3',
          '#ce5777',
          '#FFB533',
          '#126e82'
        ],
        series: [
          //图表的系列数据
          {
            name: '商品分类', //系列的名称,这里为 '商品分类',用于标识该系列。
            type: 'pie', //图表类型,这里设置为 'pie',表示这是一个饼图。
            radius: '50%', //饼图的半径,这里设置为 '50%',表示饼图占据图表的50%。
            data: [
              {value: 1048, name: '民间文学'},
              {value: 735, name: '传统音乐'},
              {value: 580, name: '传统舞蹈'},
              {value: 484, name: '传统戏剧'},
              {value: 300, name: '曲艺'},
              {value: 1048, name: '传统体育'},
              {value: 735, name: '传统美术'},
              {value: 580, name: '传统技艺'},
              {value: 484, name: '传统医药'},
              {value: 300, name: '民俗 '}
            ],
            emphasis: {
              //当用户悬停在某个数据项上时的样式设置。
              itemStyle: {
                //设置高亮时的样式。
                shadowBlur: 10, //阴影模糊度。
                shadowOffsetX: 0, //阴影的水平偏移量。
                shadowColor: 'rgba(0, 0, 0, 0.5)' //阴影的颜色。
              }
            }
          }
        ]
      };

      option && PieChart.setOption(option);
    }
    }

④调用该函数

  mounted() {
    this.initPie();
  },

⑤查看测试图形绘制

        打开刚刚添加的页面可以查看到刚刚绘制的图表

        到目前为止我们已经可以将图形绘制在前端页面上,但是这个数据是静态的,接下来需要写一个接口将数据传到前台。

4、添加数据接口获取动态数据

        在对应的goodsController.java文件中添加接口/echarts/pie

@GetMapping("/echarts/pie")
    public Result pie(){
        //查询出所有商品
        List<Goods> list = goodsService.findAll();
        return Result.success();
    }

        在goodsService.java中创建findAll()方法

    public List<Goods> findAll() {
        return goodsMapper.findAll();
    }

        在goodsMapper.java添加查询语句

@Select("select goods.*,type.name as typeName from goods left join type on goods.type_id = type.id")
List<Goods> findAll();

        到此为止,goodsController.java就可以获得查询的数据了,接下来我们需要对查询的数据进行处理,转换成饼图所需的格式。需要做的统计是将所有商品按照类别进行分组,变成key:value的形式。

        首先将查询到的list的数据变成stream流打散,然后将stream里typeName为空的数据进行过滤,过滤完之后转换成集合list,就在这个集合里处理数据,将typeName作为key,首先使用

Collectors.groupingBy进行分组,分组里面的key是Goods里面已经定义好的typeName,value则需要对里面的数据进行统计Collectors.counting,到此为止数据处理的部分已经完成。

        接着是封装好处理好的数据返回给前端,前端接收的格式为List<Map<String,Object>>,首先检查一遍处理好的数据是否为空,然后使用for循环将数据封装成key,value的格式,最后把每一条数据集合起来返回前端。完整代码如下:

@GetMapping("/echarts/pie")
    public Result pie(){
        //查询出所有商品
        List<Goods> list = goodsService.findAll();
        //将获取的数据转换成key:value形式
        Map<String, Long> collect = list.stream().filter(x -> ObjectUtil.isNotEmpty(x.getTypeName())).collect(Collectors.groupingBy(Goods::getTypeName, Collectors.counting()));
        //最后返回给前端的数据结构
        List<Map<String,Object>> mapList = new ArrayList<>();
        if (CollectionUtil.isNotEmpty(collect)){
            for (String key : collect.keySet()){
                Map<String,Object> map = new HashMap<>();
                map.put("name",key);
                map.put("value",collect.get(key));
                mapList.add(map);
            }
        }
        return Result.success(mapList);
    }

        后台改完记得重启。

5、前端页面添加动态数据

        定义initEcharts()进行数据渲染:

  mounted() {
    this.initEcharts();
    this.initPie();
  },
 methods:{
    initEcharts(){
      request.get('/goods/echarts/pie').then(res => {
        if (res.code === '200'){
          //开始去渲染数据
          this.initPie(res.data)
        }else {
          this.$message.error(res.msg)
        }
      })
    }
}

        给initPie()定义一个参数data用来传数据,将里面的静态数据使用data进行替代,修改如下:

initPie(data) {
      let chartDomPie = document.getElementById('pie');
      let PieChart = echarts.init(chartDomPie);
      let option;
      option = {
        title: {
          text: '商品类别统计(饼图)', //主标题
          subtext: '统计维度:商品分类', //副标题
          left: 'center' //标题的位置,这里设置为 'center',表示标题居中显示。
        },
        tooltip: {
          trigger: 'item' //指定 tooltip 的触发方式,这里设置为 'item',表示当用户悬停在某个数据项上时显示 tooltip。
        },
        legend: {
          orient: 'vertical', //表示图例垂直排列。
          left: 'left' //图例的位置
        },
        color: [
          '#f9f4dc',
          '#f7da94',
          '#619ac3',
          '#ac1f18',
          '#e2d849',
          '#add5a2',
          '#d276a3',
          '#ce5777',
          '#FFB533',
          '#126e82'
        ],
        series: [
          //图表的系列数据
          {
            name: '商品分类', //系列的名称,这里为 '商品分类',用于标识该系列。
            type: 'pie', //图表类型,这里设置为 'pie',表示这是一个饼图。
            radius: '50%', //饼图的半径,这里设置为 '50%',表示饼图占据图表的50%。
            data: data,
            emphasis: {
              //当用户悬停在某个数据项上时的样式设置。
              itemStyle: {
                //设置高亮时的样式。
                shadowBlur: 10, //阴影模糊度。
                shadowOffsetX: 0, //阴影的水平偏移量。
                shadowColor: 'rgba(0, 0, 0, 0.5)' //阴影的颜色。
              }
            }
          }
        ]
      };

      option && PieChart.setOption(option);
    }
},

5、前端查看图表

        可以看到前台的图表内容已经变成了我自己数据库里的数据,之后如果新增类别商品,这张图也会根据数据库的信息进行动态变化。

        总结,使用echarts绘制可视化图表,先确定绘制的图形是什么,然后复制echarts的代码进行测试,测试完后分析该图形需要哪些数据,然后在后台进行查询获取数据,获取数据后对数据进行处理,处理完后封装打包成饼图所需的结构形式传到前台,前台调用后台写好的接口,获取数据进行绘制。这个阶段的完成给了我莫大的信心,接下来还会根据我的需求进行其他的数据分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值