博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
highcharts.js绘制统计图的应用,与后台异步交互
阅读量:5817 次
发布时间:2019-06-18

本文共 5748 字,大约阅读时间需要 19 分钟。

第一步:

  在jsp中引入插件<script src="<c:urlvalue="/asset/admin/js/highcharts.js"/>"></script>

第二步:

   用div来画统计图<div id="line" style="width: 750px; height: 400px;margin: 0 auto"> </div>

第三步:

   把div与第一步的插件进行绑定代码如下

 
  1. $('#line').highcharts({  
  2.          xAxis: { //横轴       
  3.          categories: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],  
  4.           title: {text: '横轴名称'}  
  5.      },  
  6.      yAxis: {//纵轴  
  7.   
  8.          title: {  
  9.   
  10.               text: '纵轴名称'  
  11.   
  12.          }  
  13.   
  14.      },    
  15.      series: [{//画图所依据的数据  
  16.   
  17.          data: [1, 3, 5, 2, 3, 9, 6, 7, 3, 5, 4, 3]         
  18.   
  19.      }]             
  20.   
  21.      });  
  22.   
  23.  });  

 

 

几点说明:

1)      如果不指定统计图类型的话,默认的是折线统计图

2)      Series是统计所需要的数据,在本文中需要从后台获取json数据

3)      上面的series只有一条数据{ data: [1, 3, 5, 2, 3, 9, 6, 7, 3, 5, 4, 3]},在图形上的表现是只有一条线如下图

 

可以发现,为了清楚的知道这条线是指的什么,可以为这条线指定一个名字

上面的一条数据可以加一个name属性

{ name:”折线名”,data: [1, 3, 5, 2, 3, 9, 6, 7, 3, 5, 4, 3]}如图

 

 

 当然如果需要多条线,那么就需要提供多条数据就可以了

 比如: 

series:

[{name:”第一条线”,data: [1, 3, 5, 2, 3, 9, 6,7, 3, 5, 4, 3] },

  {name:”第二条线”,data: [1, 13, 8, 9, 3, 19, 1, 8, 9, 15, 14, 4] }

 

第四部:异步请求数据获取数据

   通过上面的分析,可以发现如果需要对数据绘制统计图,只需要从后台传来一个json数据串就行了,在这里用ajax异步请求数据

  异步请求代码如下:

 

var drawChart = function(sourceUrl) {           $.ajax({             "type" : "post",               "url" : sourceUrl,             "success" : function(result) {                var data = result.data;//获取数据                var categories = result.categories;//categories类别                var datas = [];                    //把data数据处理成一条条json的格式的数据,付给series                for ( var i = 0; i < data.length; i++) {                    // 构建折线图数据                    datas.push({                       name : data[i].name,//线条的名字                       data : data[i].data//线条走势所需要的数据                    });                  }//end for                   if (datas.length > 0) {                          var stepSize= Math.floor(categories.length/10);                      drawLine(datas, categories);//把所需的数据传给highcharts                      $("#line").css('display','block');                      $("#line").show();                               }               },               "dataType" : "json"           });        };       // var chart;        var drawLine = function(data, categoriess) {           chart = new Highcharts.Chart({             chart : {                renderTo : 'line',                defaultSeriesType : 'line'             },               title : {text : '频道观看时长统计图'},               xAxis : {                categories :categoriess,                title:{ text:"时间"}             },             yAxis : {title : {text : '观看时长'} },             legend: {                  layout: 'vertical',                  backgroundColor: '#FFFFFF',                  align: 'left',                  verticalAlign: 'top',                  x: 50,                  y: 20,                  floating: true,                  shadow: true              },         series :data               });      };
View Code

后台得到数据的方法如下

/**      * 数据统计图      * @throws ParseException      */      @RequestMapping(value = "/getBaseDataChart.json", method = RequestMethod.POST)        public@ResponseBody        Map
getBaseDetailDataChart(HttpServletRequest request) throws ParseException { Map
resultMap = new HashMap
(); resultMap = getData(); return resultMap; } private Map
getData(){ // 用来存储返回结果的Map Map
resultMap = new HashMap
(); List
analyticses = Text.getList(); // 把analyticses按照频道id分组 Map
map = new HashMap
(); for (int i = 0; i < analyticses.size(); i++) { Analytics analytics = (Analytics) analyticses.get(i); String channleName = analytics.getChannelName(); if (map.containsKey(channleName)) { map.get(channleName).add(analytics); } else { List
groupList = newArrayList
(); groupList.add(analytics); map.put(channleName, groupList); }// end if-else }// end for // 存放曲线的所需的数据 List
list = new ArrayList
(); // 把每一个组的list里面的Analytics对象的duration放入data for (Iterator
iterator = map.keySet().iterator(); iterator .hasNext();) {// 遍历每一个key String channelName = iterator.next();//频道名称 ChartEntity ent = new ChartEntity(); ent.setName(channelName); long[] array = newlong[map.get(channelName).size()];//画图所需的数据,对应着series的data int i = 0; for (Iterator
iterator2 = map.get(channelName) .iterator(); iterator2.hasNext();) {// 遍历每一个key对应的值也就是List Analytics ana = iterator2.next(); array[i] = ana.getDuration(); i++; }//end for ent.setData(array); list.add(ent); }//end for List
channels = this.channelServcie.listChannel(); // 横坐标所需的数据 List
channelNames = new ArrayList
(); for (Channel channel : channels) { String name = channel.getName(); channelNames.add(name); }// end for resultMap.put("categories", channelNames);// 横坐标的名字,应该改为时间最好,后续要完善 resultMap.put("data", list);// 数据 return resultMap; }
View Code

注意:

     1) 类ChartEntity里面保存了两条字段 private String name,private Long data[],并提供了两个get/set方法,

name对应着Highcharts.Chart里series的name和data

   2) Text.getList()是提供的一些测试数据,也可以从相关的数据库中获取代码如下

public static List
getList(){ List
analyticses = new ArrayList
(); //第一组数据,对应统计图的一条线 for(int i=0;i<9;i++){ Analytics a= new Analytics(); a.setChannelName("A"); a.setDuration(100+i*10); analyticses.add(a); } //第二组数据,对应统计图的一条线 for(int i=0;i<8;i++){ Analytics a= new Analytics(); a.setChannelName("B"); a.setDuration(60+i*10); analyticses.add(a); } //第三组数据,对应统计图的一条线 for(int i=0;i<15;i++){ Analytics a= new Analytics(); a.setChannelName("C"); a.setDuration(200+i*10); analyticses.add(a); } return analyticses;
View Code

 

转载于:https://www.cnblogs.com/1ming/p/5784526.html

你可能感兴趣的文章
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
re:Invent解读:没想到你是这样的AWS
查看>>
PyTips 0x02 - Python 中的函数式编程
查看>>
阿里云安全肖力:安全基础建设是企业数字化转型的基石 ...
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
Linux基础命令---rmdir
查看>>
iOS sqlite3(数据库)
查看>>
粤出"飞龙",打造新制造广东样本
查看>>
编玩边学获数千万元A轮融资,投资方为君联资本
查看>>
蓝图(Blueprint)详解
查看>>
Spark之SQL解析(源码阅读十)
查看>>
Android图片添加水印图片并把图片保存到文件存储
查看>>
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)...
查看>>
海贼王十大悲催人物
查看>>
BigDecimal 舍入模式(Rounding mode)介绍
查看>>
开源 免费 java CMS - FreeCMS1.2-标签 infoSign
查看>>
开源 免费 java CMS - FreeCMS1.9 移动APP生成栏目列表数据
查看>>
虚拟机新增加硬盘,不用重启读到新加的硬盘
查看>>
Java IO流详尽解析
查看>>
邮件服务系列之四基于虚拟用户的虚拟域的邮件系统(安装courier-authlib以及部分配置方法)...
查看>>