Echarts实现柱状图下钻功能

Echarts实现柱状图下钻功能

需求描述

在一个月份数据柱状图上,点击柱状图上的某一月份后可显示该月每一天的数据。

实现效果如下:

下钻前

下钻后

实现思路

Echarts本身并没有像HighCharts直接实现柱状图的下钻功能,但Echarts可以通过setOptions间接实现下钻功能。通过点击月份柱状图的某一月,触发点击事件,点击事件的功能是销毁该Echarts实例,并会向后台请求该月份的数据,当后台返回数据后,进行重新初始化Echarts实例。

实现细节

前端部分

  • html代码

<!DOCTYPE html>
<html style="height: 100%">
   <head>
       <meta charset="utf-8">
   </head>
   <body style="height: 100%; margin: 0">
      <div style="margin-left:40%;margin-top:2%">
        <button id='return-button' value=''>返回</button>       
      </div>
      <div id="container" style="height: 50%;width: 50%"></div>
      <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts-all-3.js"></script>
      <script type="text/javascript" src="../jquery.js"></script>
      <script type="text/javascript" src="./drillDown.js"></script>
      <script type="text/javascript" src="./return-button.js"></script>
   </body>
</html>
  • js代码

var drillDown = {
    getOption : function () {
        var option = null;
                option = {
                    title: {
                        text: '柱状图下钻示例',
                        left: 'center'
                    },
                    tooltip: {
                        trigger: 'item',
                        formatter: '{a} <br/>{b} : {c}'
                    },
                    legend: {
                        left: 'left',
                        data: ['月数据']
                    },
                    xAxis: {
                        type: 'category',
                        name: 'x',
                        splitLine: {show: false},
                        data: ['2016-01', '2016-02', '2016-03', '2016-04', '2016-05', '2016-06', '2016-07', '2016-08', '2016-09']
                    },
                    grid: {
                        left: '3%',
                        right: '4%',
                        bottom: '3%',
                        containLabel: true
                    },
                    yAxis: {
                        type: 'log',
                        name: 'y'
                    },
                    series: [
                        {
                            name: '月数据',
                            type: 'bar',
                            data: [1, 2, 4, 8, 16, 32, 64, 128, 256]
                        }
                    ]
                };
                return option;
    },
    initChart : function (myChart,option) {
        myChart.setOption(option);
        myChart.on('click',function(object){
          // 销毁之前的echarts实例
        echarts.dispose(dom);
        // 初始化一个新的实例
        var myChart = echarts.init(dom);
        // object为当前的这个echart对象
        // console.dir(object);
        // 我们可以看到name属性即为当前点击点的对应月份值,那么我们可以通过这个值去接口查询对应201609月份下的每一天的值.
        // 此处的201609月份数据可以通过接口读取
        // $.ajax(
        //     type : 'get',
        //     url : selectBymonth.do+ '&month=' + object.name,
        //     dataType : 'json',
        //     success : function (msg){
        //         option.xAxis.data = msg.xAxis;
        //         option.series.data = msg.yAxis;
        //         myChart.setOption(option, true);
        //     }
        // );
​
        // 这里就模拟一个测试数据,做为demo演示
        option.xAxis.data = [
        '2016-09-01','2016-09-02','2016-09-03','2016-09-04','2016-09-05','2016-09-06','2016-09-07','2016-09-08',
        '2016-09-09','2016-09-10','2016-09-11','2016-09-12','2016-09-13','2016-09-14','2016-09-15','2016-09-16',
        '2016-09-17','2016-09-18','2016-09-19','2016-09-20','2016-09-21','2016-09-22','2016-09-23','2016-09-24',
        '2016-09-25','2016-09-26','2016-09-27','2016-09-28','2016-09-29','2016-09-30'
        ];
        option.series.data = [
            3,4,5,6,5,6,7,8,8,9,
            12,13,15,16,20,12,30,21,22,29,
            30,31,33,34,35,36,20,29,33,40
        ];
        option.legend.data= ['日数据'];                
        option.series[0].name=['日数据'];
        myChart.setOption(option, true);
    });
  },
};

后端接口

    
@RequestMapping("selectBymonth.do")
    @ResponseBody
    public ServerResponse addCategory(HttpSession session,String month){
        Map<String, Object>  map  =  new HashMap<>(); 
        ResultBean result = onSelectByMonth(month); 
        out.println("result==>"  + result); 
        map.put("xAxis", result.day());                             
        map.put("yAxis", result.value()); 
        return map;
        }
    }

*这里没有具体实现全部代码,而是使用简单的伪代码描述了后台接口实现思路。

总结

猜你喜欢

转载自blog.csdn.net/LiFHCode/article/details/81203988