HighCharts使用

这个是很多天之前做的了,当时上级要求做一个报表,内部用的小工具。其中要画折线图,柱状图这些。用了一下JFreeChart,图是做出来了,但是这个效果很不好。直接生成了一张图片展示出来,无法进行交互。百度一下,看到了highcharts,大家评论也不错,生成的图表很酷。

highcharts和easyui很像,都是通过json来传递数据,我们要做的,就是在后台封装前端所需要的数据和格式。

这里说的是Highcharts中的HighStock这个工具,因为做时间图的时候,数据非常多,HighCharts是无法实现那么多的,但是HighStock没问题。

先上前端的代码:

function querygraph(){
    $(function () { 
        var chart;
        var ground=$('#cc').combobox('getValue'); 
        var begin_time=$('#begin_time').datetimebox('getValue');
        var end_time=$('#end_time').datetimebox('getValue');
        $(function(){
            $.ajax({
                type:'POST',
                dataType:'JSON',
                url:'TimeGraph',
                data:"ground="+ground+"&begin_time="+begin_time+"&end_time="+end_time,
                beforeSend: ajaxLoading(),
                    success:function(result){
                        ajaxLoadEnd();
                        $('#container').highcharts('StockChart',{  
                        credits:{
                            enabled:false
                        },
                        rangeSelector : {
                                selected : 1
                            },
                            
                        title: { text: result.text, x: -20 }, 
                        
                        subtitle: {    text:result.subtitle, x: -20},
                        
                         plotOptions: { 
                             series:{
                                 turboThreshold:0
                             }
                         },
                         xAxis: {  
                                tickPixelInterval: 200,//x轴上的间隔  
                            //  title :{  
                            //      text:"title"  
                            //  },  
                                type: 'datetime', //定义x轴上日期的显示格式  
                                labels: {  
                                formatter: function() {  
                                    return  Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.value); 
                                },  
                                align: 'center'  
                            }  
                            }, 
                        yAxis: { 
                            title: { text: '泊位数量' },
                            //min: 0, 
                            minorGridLineWidth: 0,
                            gridLineWidth: 0,
                            alternateGridColor: null,
                             plotBands: [{ // Light air 
                                 from: result.begin, to: result.total, 
                                 color: 'rgba(255, 0, 0, 0.7)',
                                 label: { 
                                     text: '总泊位数:'+result.total, 
                                     style: { color: '#606060' 
                                         } 
                             } }]
                             },
                        series : [{ 
                            name : '空余数量', 
                            data : result.series,
                            tooltip: { valueDecimals: 0 }
                        }]
                        
                    }); 
            }
            }
            );
        });
    });
    }

主要用的js代码如上,其中首部声明的变量是为了从easyui获取字段数据的。

然后在ajax中请求url,获取json数据。

比较麻烦的是后端数据拼装了。

    public JSONObject getData(String begin_time,String end_time,String ground_code){
        logger.info("ground:"+ground_code+"==");
        logger.info("begin:"+begin_time);
        logger.info("end:"+end_time);
        JSONObject result=new JSONObject();
        String ground_name=reportService.getGroundnameByid(Long.parseLong(ground_code));
        logger.info("groundname:"+ground_name);
        List<Report> list=reportService.getReport(Long.parseLong(ground_code), Timestamp.valueOf(begin_time), Timestamp.valueOf(end_time));
        //数据1,空闲数量
        JSONArray jsonArray2=new JSONArray();
        //数据2,全部
        long total=reportService.getTotalBerth(Long.parseLong(ground_code));
        for (int i = 0; i < list.size(); i++) {
            Report report=list.get(i);
            Date date=report.getRecord_time();
            long time=date.getTime();
            JSONArray jsonArray=new JSONArray();
            jsonArray.add(time);
            jsonArray.add(report.getAvailable_berth_number());
            jsonArray2.add(jsonArray);
        }
        result.put("text", ground_name+" 泊位统计图");
        result.put("subtitle", begin_time+" 到 "+end_time+"之间的统计量");
        result.put("begin", total-0.5);
        result.put("total", total);
        result.put("series",jsonArray2);
        logger.info("result:"+result.toString());
        return result;
    }
    

其中,主要的数据是jsonArray2这个,这个类型是[[时间,数据],[时间,数据],...] 。时间是utc时间,如果前后台用的时间不一致的话,其中有一个不是utc时间,那么会造成时差八小时的问题,这个要统一。要么是前端禁用utc时间,要么后台时间也转成utc时间。

效果图如下:

除了这个工具,highcharts默认的那些都很好用,api里面说明也很多。

也做了一个柱状图,数据拼装代码如下:

    public JSONObject getData(String begin_time,String end_time,String ground){
        JSONObject result=new JSONObject();
        Timestamp begin=Timestamp.valueOf(begin_time);
        Timestamp end=Timestamp.valueOf(end_time);
        String ground_name=groundFlowService.getGroundNameById(Long.parseLong(ground));
        List<FlowDaily> list=groundFlowService.getGroundflow(Long.parseLong(ground), begin, end);
        JSONObject categories_json=new JSONObject();
        JSONObject series_json_in=new JSONObject();
        JSONObject series_json_out=new JSONObject();
        JSONArray series_jsonarray=new JSONArray();
        String[] cata=new String[list.size()];
        long[] data_int=new long[list.size()];
        long[] data_out=new long[list.size()];
        //驶入量
        series_json_in.put("name", "驶入量");
        series_json_out.put("name", "驶出量");
        for (int i = 0; i < data_int.length; i++) {
            FlowDaily flowDaily=list.get(i);
            data_int[i]=flowDaily.getIncount();
            data_out[i]=flowDaily.getOutcount();
            cata[i]=flowDaily.getStat_date().toString().substring(0, 10);
        }
        series_json_in.put("data", data_int);
        series_json_out.put("data", data_out);
        categories_json.put("categories", cata);
        series_jsonarray.add(series_json_in);
        series_jsonarray.add(series_json_out);
        result.put("text", ground_name+" 柱状统计图");
        result.put("subtitle", begin_time+" 到 "+end_time+"之间的统计量");
        result.put("categories", categories_json);
        result.put("series", series_jsonarray);
        /*拼接的结果格式
         * categories: ['Apples', 'Oranges', 'Pears', 'Grapes', 'Bananas'] 
         *     series: [{ name: 'John', data: [5, 3, 4, 7, 2] }, 
                    { name: 'Jane', data: [2, -2, -3, 2, 1] }, 
                    { name: 'Joe', data: [3, 4, 4, -2, 5] }] */
        logger.info(result);
        return result;
    }

 

posted @ 2014-09-18 14:28  薛定谔的猫_  阅读(5386)  评论(25编辑  收藏  举报