使用echarts绘制统计分析图表(动态从后台获取数据)

说明:实际项目中的统计分析模块不仅需要数据以表格的方式显示,还需要用图形化的方式进一步渲染,以提升数据的可观性,以下是使用echarts来进行绘制统计分析图表的案例:

一。第一个静态echarts示例

1.echarts的使用教程在官方网站上有详细说明:echarts官网
如下图所示:
在这里插入图片描述
2.这里做一个简单的介绍:首先你需要下载一个echarts官方源码包echarts官方源码包
在其中选择自己所需要下载的版本,如下图所示:
在这里插入图片描述
3.下载完成后解压,echarts.min.js就是我们需要引用的js文件,把它复制到我们需要进行引用的项目路径下,如下图所示:
在这里插入图片描述
在这里插入图片描述
4.然后我们在index.html文件中引入该echarts.min.js文件,并在页面定义好显示图表的控件,源代码如下:

// An highlighted block
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="echarts.min.js"></script>
</head>
<body>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="main" style="width: 100%;height:400px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: 'ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data:['销量']
            },
            xAxis: {
                data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
            },
            yAxis: {},
            series: [{
                name: '销量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            }]
        };

        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>
</body>
</html>

5.打开index.html页面,页面效果如图所示:
在这里插入图片描述
6.如果需要实现不同的图表显示功能,在echarts官网上找到对应的实例,更换JavaScript代码块中的option变量就行了,如下图所示:
在这里插入图片描述
在这里插入图片描述

7.数据可以根据你的需求进行修改,效果图如下:
在这里插入图片描述

二。动态echarts示例(从后台获取数据)

说明:在echarts中各个类型数据的显示都需要不同数据来进行传入,我们需要在后台封装好我们所需要显示的数据,再利用ajax去进行调用,获得相应的图表数据。简单来说,每种echarts示例类型所需要的数据都是不尽相同的,echarts需要什么数据我们就把数据封装成什么样子,然后再去给echarts使用,从而达到页面图表渲染的效果。

1.控制器端代码如下所示:

/**
     * 工地预警类型统计
     */
    @RequestMapping("/cList")
    @ResponseBody
    public Object cList(@RequestParam(required = false) String beginTime, @RequestParam(required = false) String endTime){
        ArrayList<Integer> constructionIdList=new ArrayList<>();
        //初始化工地名称集合
        ArrayList<String> constructionNameList=new ArrayList<>();
        //初始化告警类型为安全帽类型集合
        ArrayList<Integer> safetyHatTypeList=new ArrayList<>();
        //初始化告警类型为工作服类型集合
        ArrayList<Integer> coverallTypeList=new ArrayList<>();
        //初始化告警类型为安全带类型集合
        ArrayList<Integer> safetyBeltTypeList=new ArrayList<>();
        //初始化告警类型为越界告警类型集合
        ArrayList<Integer> crossBoundaryTypeList=new ArrayList<>();
        //得到所有告警工地id list
        constructionIdList=dataStatisticsService.getConstructionId();
        //初始化告警类型vo集合
        ArrayList<AlarmTypeVo> alarmTypeVoList=new ArrayList<>();
        //便利所有告警工地id
        for(Integer id:constructionIdList){
            //初始化告警类型vo类
            AlarmTypeVo alarmTypeVo=new AlarmTypeVo();

            alarmTypeVo.setBeginTime(beginTime);
            alarmTypeVo.setEndTime(endTime);

            //根据告警工地id得到告警工地名称
            String conStructionName=dataStatisticsService.getConstructionNameByConstructionId(id);
            //加入告警工地名称list中
            constructionNameList.add(conStructionName);
            alarmTypeVo.setConstructionSite(conStructionName);

            //根据工地id查询告警类型为0(安全帽)的总数
            int safetyHatCount=dataStatisticsService.getCameraTypeNumber(id,0,beginTime,endTime);
            //加入告警类型为0(安全帽)List中
            safetyHatTypeList.add(safetyHatCount);
            alarmTypeVo.setSafetyHatCount(safetyHatCount);

            //根据工地id查询告警类型为1(工作服)的总数
            int coverallCount=dataStatisticsService.getCameraTypeNumber(id,1,beginTime,endTime);
            //加入告警类型为0(安全帽)List中
            coverallTypeList.add(coverallCount);
            alarmTypeVo.setCoverallCount(coverallCount);

            //根据工地id查询告警类型为2(安全带)的总数
            int safetyBeltCount=dataStatisticsService.getCameraTypeNumber(id,2,beginTime,endTime);
            //加入告警类型为0(安全帽)List中
            safetyBeltTypeList.add(safetyBeltCount);
            alarmTypeVo.setSafetyBeltCount(safetyBeltCount);

            //根据工地id查询告警类型为3(越界施工)的总数
            int crossBoundaryCount=dataStatisticsService.getCameraTypeNumber(id,3,beginTime,endTime);
            //加入告警类型为0(安全帽)List中
            crossBoundaryTypeList.add(crossBoundaryCount);
            alarmTypeVo.setCrossBoundaryCount(crossBoundaryCount);

            //加入list中
            alarmTypeVoList.add(alarmTypeVo);
        }

        //初始化json对象
        JSONObject jsonData=new JSONObject();

        //把需要的数据放入json对象中
        jsonData.put("alarmTypeVoList",alarmTypeVoList);
        jsonData.put("constructionNameList",constructionNameList);
        jsonData.put("safetyHatTypeList",safetyHatTypeList);
        jsonData.put("coverallTypeList",coverallTypeList);
        jsonData.put("safetyBeltTypeList",safetyBeltTypeList);
        jsonData.put("crossBoundaryTypeList",crossBoundaryTypeList);

        //返回json对象
        return jsonData;

    }

2.前台html页面代码如下:

// An highlighted block
@layout("/common/_container.html"){
<div class="row">
    <div class="col-sm-12">
        <div class="ibox float-e-margins">
            <div class="ibox-title">
                <h5>工地预警数据统计</h5>
            </div>
            <div class="ibox-content">
                <div class="row row-lg">

                    <div class="row">
                        <div class="col-sm-2">
                            <#TimeCon id="beginTime" name="录入时间" isTime="false" pattern="YYYY-MM-DD" />
                        </div>
                        <div class="col-sm-2">
                            <#TimeCon id="endTime" name="——" isTime="false" pattern="YYYY-MM-DD" />
                        </div>

                        <div class="col-sm-2">
                            <#button name="搜索" icon="fa-search" clickFun="search()"/>
                           <!-- <#button name="导出" icon="fa-plus" clickFun=""/>-->
                        </div>
                    </div>

                    <div class="col-sm-12">
                        <div id="main" style="width: 100%;height:400px;"></div>
                    </div>

                    <div class="col-sm-12">
                        <table id="table">
                            <thead>
                            <tr>
                                <th data-field="beginTime">开始时间</th>
                                <th data-field="endTime">结束时间</th>
                                <th data-field="constructionSite">工地地址</th>
                                <th data-field="safetyHatCount">安全帽</th>
                                <th data-field="coverallCount">工作服</th>
                                <th data-field="safetyBeltCount">安全带</th>
                                <th data-field="crossBoundaryCount">越界施工</th>
                            </tr>
                            </thead>
                        </table>
                        <#table id="alarmTypeTable"/>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<!--<script src="${ctxPath}/static/modular/system/data/alarmType.js"></script>-->
<script src="${ctxPath}/static/js/echarts.min.js"></script>
<script>
    //时间选择控件
    laydate.render({
        elem: '#beginTime'
    });
    laydate.render({
        elem: '#endTime'
    });


    //从后台获取图表所需要的json数据
    function dataJson(a){
        var data=[];
        $.ajax({
            type : "post",
            async : false, //同步执行
            url : Feng.ctxPath +"/dataStatistics/cList",
            //带入的参数查询条件
            data :{beginTime:$("#beginTime").val(),endTime:$("#endTime").val()},
            dataType : "json", //返回数据形式为json
            success : function(result) {
                switch (a) {
                    //获取工地名称数据
                    case 0:data=result.constructionNameList;break;
                    //获取告警类型为安全帽数据
                    case 1:data=result.safetyHatTypeList;break;
                    //获取告警类型为工作服数据
                    case 2:data=result.coverallTypeList;break;
                    //获取告警类型为安全带数据
                    case 3:data=result.safetyBeltTypeList;break;
                    //获取告警类型为越界施工数据
                    case 4:data=result.crossBoundaryTypeList;break;
                    //获取告警类型vo集合
                    case 5:data=result.alarmTypeVoList;break;
                }

            },
            error : function(errorMsg) {
                alert("不好意思,图表请求数据失败啦!");
                myChart.hideLoading();
            }
        })
        return data;
    }

    //条件查询为空时
    //定义一个接收工地名称数据的变量
    var alarmTypeName=dataJson(0);
    //定义一个告警类型为安全帽数据的变量
    var safetyHat=dataJson(1);
    //定义一个告警类型为工作服数据的变量
    var coverall=dataJson(2);
    //定义一个告警类型为安全带数据的变量
    var safetyBelt=dataJson(3);
    //定义一个告警类型为越界施工数据的变量
    var crossBoundary=dataJson(4);

    //初始加载加载图表(无条件时查询时)
    initChart();

//初始化以及加载图表
function initChart() {
    // 基于准备好的dom,初始化echarts实例
    var myChart = echarts.init(document.getElementById('main'));

    // 指定图表的配置项和数据
    var option = {
        //图表颜色变化
        //color:['#05DDDF', '#E44F5E','#FFB642','#39DD68','#3261FE'],
        tooltip: {
            trigger: 'axis',
            axisPointer: {            // 坐标轴指示器,坐标轴触发有效
                type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
            }
        },
        legend: {
            /*  data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']*/
            data: ['安全帽', '工作服', '安全带', '越界施工']
        },
        grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
        },
        xAxis: {
            type: 'value'
        },
        yAxis: {
            type: 'category',
            /* data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']*/
            data:alarmTypeName
        },
        series: [
            {
                name: '安全帽',
                type: 'bar',
                stack: '总量',
                label: {
                    show: true,
                    position: 'insideRight'
                },
                data:safetyHat

            },
            {
                name: '工作服',
                type: 'bar',
                stack: '总量',
                label: {
                    show: true,
                    position: 'insideRight'
                },
                data:coverall
            },
            {
                name: '安全带',
                type: 'bar',
                stack: '总量',
                label: {
                    show: true,
                    position: 'insideRight'
                },
                data:safetyBelt
            },
            {
                name: '越界施工',
                type: 'bar',
                stack: '总量',
                label: {
                    show: true,
                    position: 'insideRight'
                },
                data:crossBoundary
            }
        ]
    };

    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
}

    //获得后台返回的告警类型vo集合
    var data = dataJson(5);
   //初始化表格
   function  initTable() {
       $('#table').bootstrapTable({data: data});
   }
    //初始化加载表格(无条件时查询时)
    initTable();


    //点击搜素事件
    function search(){
        //输入条件查询后重新得到条件查询后的数值
        alarmTypeName=dataJson(0);
        safetyHat=dataJson(1);
        coverall=dataJson(2);
        safetyBelt=dataJson(3);
        crossBoundary=dataJson(4);

        //带条件之后重新加载图表
        initChart();

        //输入条件查询后重新得到条件查询后的数值
        data = dataJson(5);
        //bootstrapTable清空表格重新加载
        $('#table').bootstrapTable('destroy');
        //带条件之后重新加载表格
        initTable();
    }
</script>
@}

3.页面效果图如下所示:
在这里插入图片描述
4.输入时间条件查询过后,图表数据发生变化,如下图所示:
在这里插入图片描述

总结:echarts通过图表的渲染可以让数据变得更加的可视化,在统计分析模块我们只需要在echarts官网上找到我们所需要的图表实例,根据实例中的data来封装我们的数据,得到相应的图表数据。可视化的图表数据能够提高用户的使用体验,使数据变得直观明了,便于用户对数据的统计分析

  • 5
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Vue中使用Echarts实现动态绘制图表及异步加载数据的方法,主要分为两个步骤: 第一步,安装Echarts和vue-echarts 1.在项目中安装Echarts使用npm命令:npm install echarts --save 2.安装vue-echarts使用npm命令: npm install vue-echarts --save 第二步,实现动态绘制图表及异步加载数据的方法 1.定义一个“echarts”组件,该组件是vue-echarts提供的一个图表组件,用于绘制图表。 2.在“echarts”组件中定义一个“chartMixin”对象,用于定义图表的数据和属性。 3.在“created”生命周期中,使用Echarts提供的异步加载数据的方法“echarts.init(dom).setOption(option);”加载数据。 4.使用vue-watch监听数据的变化,当数据发生变化时,重新绘制图表。 示例代码: <template> <div class="echarts-container" ref="chartDom"></div> </template> <script> import echarts from 'echarts' import VueECharts from 'vue-echarts' export default { name: 'echarts', components: { VueECharts }, mixins: [ { data() { return { option: { //定义图表的属性 xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [ { data: [820, 932, 901, 934, 1290, 1330, 1320], type: 'bar' } ] } } } } ], data() { return { chartDom: null //定义图表的dom } }, created() { this.chartDom = this.$refs.chartDom this.drawChart() }, watch: { //监听数据的变化,重新绘制图表 option: function() { this.drawChart() } }, methods: { drawChart() { //使用Echarts提供的异步加载数据的方法加载数据 const chart = echarts.init(this.chartDom) chart.setOption(this.option) } } } </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Keson Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值