`
Everyday都不同
  • 浏览: 723664 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

highcharts之堆栈面积(折线)图——结合后台数据

    博客分类:
  • jsp
阅读更多

highcharts的堆栈面积图适用于一组对象对同一个指标在一段时间范围内进行走势的展示,同时,在每个时间点可以同时显示出每个对象在这个时间点的值,一目了然。官网上的是这样的:



 

实际情况中,需要结合后台查询出数据再填充,难点在于数据结构的拼装。而且有时候还不止一个指标,你可能被要求得出若干个指标在这组对象的这段时间的值。

 

下面,我就来模拟一种情景:

假设有app1,app2, app3三个对象,我需要得出他们在20160301, 20160302, 20160303这3个月的index1,index2,index3这3个指标值,并用趋势图的形式展示出来,首先,模拟查询出来的结果,真实的sql语句肯定是要按app和date来group by的:



 

我以index1这个指标为例,来画一个堆栈图。难点在于后台数据结构的拼装:

//先用假设据模拟
			 Map<String, List<Object>> map1 = new HashMap<String, List<Object>>();//模拟index1的map  
				Map<String, List<Object>> map2 = new HashMap<String, List<Object>>();//模拟index2的map
				Map<String, List<Object>> map3 = new HashMap<String, List<Object>>();//模拟index3的map
				
				String[] keys = {"a", "b", "c"};//模拟系统
				//模拟查询出的数据
				List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
				Map<String, Object> data1 = new HashMap<String, Object>();
				data1.put("app", "app1");
				data1.put("date", "20160301");
				data1.put("index1", 100);
				data1.put("index2", 0.9);
				data1.put("index3", 0.34);
				data.add(data1);
				Map<String, Object> data2 = new HashMap<String, Object>();
				data2.put("app", "app1");
				data2.put("date", "20160302");
				data2.put("index1", 110);
				data2.put("index2", 0.88);
				data2.put("index3", 0.3);
				data.add(data2);
				Map<String, Object> data3 = new HashMap<String, Object>();
				data3.put("app", "app1");
				data3.put("date", "20160303");
				data3.put("index1", 101);
				data3.put("index2", 0.9);
				data3.put("index3", 0.64);
				data.add(data3);

                Map<String, Object> data4 = new HashMap<String, Object>();
				data4.put("app", "app2");
				data4.put("date", "20160301");
				data4.put("index1", 120);
				data4.put("index2", 0.89);
				data4.put("index3", 0.94);
				data.add(data4);
				Map<String, Object> data5 = new HashMap<String, Object>();
				data5.put("app", "app2");
				data5.put("date", "20160302");
				data5.put("index1", 110);
				data5.put("index2", 0.88);
				data5.put("index3", 0.3);
				data.add(data5);
				Map<String, Object> data6 = new HashMap<String, Object>();
				data6.put("app", "app2");
				data6.put("date", "20160303");
				data6.put("index1", 201);
				data6.put("index2", 0.88);
				data6.put("index3", 0.04);
				data.add(data6);
				
				Map<String, Object> data7 = new HashMap<String, Object>();
				data7.put("app", "app3");
				data7.put("date", "20160301");
				data7.put("index1", 300);
				data7.put("index2", 0.9);
				data7.put("index3", 0.34);
				data.add(data7);
				Map<String, Object> data8 = new HashMap<String, Object>();
				data8.put("app", "app3");
				data8.put("date", "20160302");
				data8.put("index1", 310);
				data8.put("index2", 0.88);
				data8.put("index3", 0.335);
				data.add(data8);
				Map<String, Object> data9 = new HashMap<String, Object>();
				data9.put("app", "app3");
				data9.put("date", "20160303");
				data9.put("index1", 401);
				data9.put("index2", 0.3);
				data9.put("index3", 0.84);
				data.add(data9);
				
				Set<String> times =  new HashSet<String>();
				
				for(int i=0; i<data.size(); i++) {
					Map<String, Object> dto = data.get(i);
					String app = (String) dto.get("app");
					long index1 = Long.valueOf(dto.get("index1").toString());
					double index2 = (double) dto.get("index2");
					double index3 = (double) dto.get("index3");
					
					getMapData(map1, app + "|index1", index1);
					getMapData(map2, app + "|index2", index2);
					getMapData(map3, app + "|index3", index3);
					
					times.add((String)dto.get("date"));
				
				}
				List<String> timess = new ArrayList<String>(times);
				Collections.sort(timess);
				System.out.println(times);
				System.out.println(timess);
				System.out.println(map1);
				System.out.println(map2);
				System.out.println(map3);
				
				result.put("map1", map1);
				result.put("map2", map2);
				result.put("map3", map3);
				result.put("times", timess);
				
				public static void getMapData(Map<String, List<Object>> map, String key, Object data) {
                List<Object> list = map.get(key);
                if(list == null) {
                    list = new ArrayList<Object>();
                    map.put(key, list);
                }
                list.add(data);
            }

 可以看出这段模拟group by查询出的结果打印如下:

times: [20160301, 20160302, 20160303]

指标1的map:{app3|index1=[300, 310, 401], app1|index1=[100, 110, 101], app2|index1=[120, 110, 201]}

指标2的map:{app3|index2=[0.9, 0.88, 0.3], app1|index2=[0.9, 0.88, 0.9], app2|index2=[0.89, 0.88, 0.88]}

指标3的map:{app3|index3=[0.34, 0.335, 0.84], app1|index3=[0.34, 0.3, 0.64], app2|index3=[0.94, 0.3, 0.04]}

 

即为js需要的数据结构,一个指标的map对应一个图。以指标1(index1)为例,js代码如下:

$.ajax({
		async : true,
		type : "POST",
		data:dataParam,
		dataType:"json",
		url :url,
		success : function(data) {
			var times = data.times;
			var map1= data.map1;
			var map2= data.map2;
			var map3= data.map3;
			
			//堆栈面积图数据填充  针对指标1,其他指标原理类似
			var chart = $('#container').highcharts();
			var xAixs = chart.xAxis[0];
            xAixs.setCategories(times);
            
            var series = chart.series; 
            while(series.length > 0) {  
                series[0].remove(false);//remove这个series之后是否重绘charts  
            }  
            
            //js里面循环map1的key和value
            for(var prop in dataMap) {
                if(dataMap.hasOwnProperty(prop)) {
                    var strs = prop.split("|");
                     chart.addSeries({ 
                                name: strs[0],
                                data: dataMap[prop]
                    }, false);
                }
            }
             chart.redraw();
		}
	  }
	);

 这里需要注意如何在js里循环一个map型(后台传过来,前台是一个json格式的对象)的方法。

 

针对指标1的堆栈面积图,结果如下:(也可以画堆栈折线图,只要你设置chart的type为line即可~~)


 

 画其他指标的堆栈图也类似做就行了。

  • 大小: 26.5 KB
  • 大小: 4.3 KB
  • 大小: 11 KB
分享到:
评论

相关推荐

    highcharts快速生成百万数据点折线图.rar

    在处理大数据量时,Highcharts提供了高效的优化策略,使得即使百万级别的数据点也能流畅地在折线图上展示。本文将深入探讨如何使用Highcharts高效地生成百万数据点的折线图。 首先,理解数据分块加载的概念是关键。...

    Java和Highcharts实现折线图

    总之,Java和Highcharts的结合提供了一种强大而灵活的方式,用于在Web应用中展示动态的折线图。通过Java处理数据和构建后端接口,以及Highcharts在前端渲染图表,我们可以创建出交互性强、用户体验良好的数据可视化...

    highcharts实现从mysql数据库获取数据生成折线图

    本篇将详细介绍如何利用Highcharts结合MySQL数据库,实现在Web应用中动态生成折线图。 首先,我们需要了解Highcharts的基本使用。Highcharts是一个轻量级的图表库,它提供了丰富的API和配置选项,可以自定义图表...

    Highcharts AJAX后台JAVA JSON 曲线报表完美可运行例子 不包含官方JS 自己下载

    Highcharts是一款广泛应用于Web开发中的JavaScript图表库,它能够帮助开发者轻松创建各种动态、交互式的图表,如折线图、柱状图、饼图等。在这个"Highcharts AJAX后台JAVA JSON 曲线报表完美可运行例子"中,我们将...

    Highcharts 折线统计图

    在Highcharts中,折线图通过连接一系列数据点形成连续的折线,使得用户可以清晰地看到数据随时间的变化情况。 要使用Highcharts创建折线图,你需要遵循以下步骤: 1. **引入库文件**:在HTML文件中,需要引入...

    折线图demo highCharts

    **折线图在数据分析与可视化中的重要性** 折线图是一种常见的数据可视化工具,它能够清晰地展示数据随时间变化的趋势。在IT行业中,尤其是在数据分析、监控和报告领域,折线图的应用尤为广泛。例如,它常用于表示...

    Highcharts画折线图

    这个"Highcharts画折线图"的主题涉及到使用Highcharts来绘制动态、交互式的折线图,这对于数据可视化和数据分析来说是非常重要的。下面将详细介绍如何利用Highcharts库创建折线图以及相关的知识点。 1. **...

    HighCharts多折线图实际应用【js+java】

    HighCharts的2017年使用的实例,此番为折线图,一个图里包含多条折线,业务需求:展示多个支付方式,在某段时间内,刷卡金额的趋势折线图。我用的方法比较笨,将支付方式一个一个列出来了,还有优化的空间,不过完全...

    highcharts导出图片的后台代码

    highcharts导出图片的后台代码,这样就不用从highcharts官网服务器上进行图片导出了,成了一个本地的服务器!

    highcharts.js实现曲线图、柱状图、面积图等

    Highcharts.js是一款强大的JavaScript图表库,它允许开发者轻松地在网页上创建各种动态、交互式的图表,包括曲线图、柱状图、面积图等多种图表类型。这个库以其易用性、灵活性和丰富的定制选项而受到广泛欢迎。在...

    折线、双Y轴、不交叉、highcharts、按照日期分割线

    Highcharts是一款强大的JavaScript图表库,用于在Web页面上创建各种数据可视化效果,包括折线图、柱状图、饼图等。在这个特定的场景中,我们关注的是如何使用Highcharts来绘制一个具有双Y轴的折线图,并且这两条折线...

    highcharts加载多条曲线数据

    Highcharts是一款强大的JavaScript图表库,用于在Web页面上创建各种互动图表,如折线图、柱状图、饼图等。在"highcharts加载多条曲线数据"的场景下,我们通常指的是在一个图表中同时展示多组数据,每组数据表现为一...

    android_highcharts 折线图

    在Android开发中,Highcharts是一个常用的JavaScript图表库,它提供了丰富的图表类型,如折线图、柱状图、饼图等。本节我们将详细探讨如何在Android应用中调用Highcharts.js来实现折线图的展示。 首先,理解...

    highcharts.js,实时折线图需要的样式

    Highcharts 是一个用纯JavaScript编写的一个图表库,HighCharts支持的图表类型有曲线图、区域图、柱状图、饼状图、散状点图和综合图表。

    jq报表折线图

    综上所述,"jq报表折线图"功能模块提供了丰富的数据可视化工具,结合jQuery的易用性,使得开发者可以快速构建交互式且富有洞察力的报表。通过3D图表、导出、金字塔图和钻取功能,用户可以更全面、有效地理解和解析...

    jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】

    主要介绍了jQuery插件HighCharts绘制的基本折线图效果,结合实例形式分析了jQuery基于HighCharts插件绘制图形的具体实现步骤与相关操作技巧,并附带demo源码供读者下载参考,需要的朋友可以参考下

    java实现Echarts折线图历史数据显示(一)

    在本教程中,我们将探讨如何使用Java和ECharts来实现从MySQL数据库中获取历史数据并在前端展示为折线图。ECharts是一款由百度开源的、基于JavaScript的数据可视化库,能够生成丰富的图表类型,包括折线图。而Java...

    highcharts后台数据交互及各种常用设置配置

    highcharts的常用配置,后台数据的交互。数据的下钻,已经导出相关配置,返回按钮配置。堆叠图,加折线图,展示环比增量。包含内容丰富,

    echarts和highcharts全国及各省市地图

    【标题】"echarts和highcharts全国及各省市地图"涉及的是两个主流的JavaScript数据可视化库——ECharts和Highcharts,它们在中国地图的绘制方面提供了广泛的支持。这两款工具可以帮助开发者将复杂的数据转换为易于...

    jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】

    本文实例讲述了jQuery插件HighCharts绘制简单2D折线图效果。分享给大家供大家参考,具体如下: 1、实例代码: &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset=UTF-8&gt; &lt;title&gt;HighCharts ...

Global site tag (gtag.js) - Google Analytics