HighCharts趋势图动态设置Series数组(根据后台决定具体几个data), 并动态刷新数据
2016-06-17 15:46
766 查看
最近要做一些前台的数据展示, 用到了HighCharts.我这次做的是趋势图,涉及到动态刷新,因为涉及到了动态刷新,为了便于记忆,在这里记录一下。
在Highcharts中文网上有相应的演示demo,一般你所需要的图的样式都可以找到。可以在demo基础上进行修改。
附Highcharts中文网:http://www.hcharts.cn/demo/index.php
首先,是引入HIghcharts绘图相关的js文件和jQuery.js。
接下来,把HIghcharts动态刷新的格式拷贝并作修改:
重点是chart里面的event属性,series属性。注意,此时:series属性是一个js函数的返回值,需用“js函数名()”来取得。
HighCharts中文网demo里面,series是这样的:
这时,图表中只有一条折线,且x、y轴数据都不能确定,需要在这里添加ajax方法从后台获取数据,从而决定图表折线(曲线)条数,x、y轴数据等。所以就用到了create()方法。如下所示:
上面代码块中的:series.push({“name”: name, “data”: data});就是在series【】数组中添加数据,且通过根据for循环生成多条”曲线”。并放入数据。
而chart里面的event属性, 则是每隔一段时间(1000*5=5s)刷新页面数据,方法主要是通过ajax请求后台,得到相应数据并且处理相应数据后,放到一个数据结构或json对象中。
效果图:
其中,右侧的图例名称是series[i].name
在Highcharts中文网上有相应的演示demo,一般你所需要的图的样式都可以找到。可以在demo基础上进行修改。
附Highcharts中文网:http://www.hcharts.cn/demo/index.php
首先,是引入HIghcharts绘图相关的js文件和jQuery.js。
接下来,把HIghcharts动态刷新的格式拷贝并作修改:
var chart; $(document).ready( function() { Highcharts.setOptions({ global : { useUTC : false } }); chart = new Highcharts.Chart({ chart : { renderTo : 'container', //图表放置的容器,DIV defaultSeriesType : 'spline', //图表类型为曲线图 events : { load : function() { var series = this.series; setInterval(function() { $.ajax({ type: "POST", url: "cpuMemmaryMonitor/selectCpuDatas.do?userid="+userid", async: false, //表示同步,如果要得到ajax处理完后台数据后的返回值,最好这样设置 success: function(result){ results = eval("(" + result + ")"); var size = results.length; for(var i=0; i<series.length; i++) { for(var j=0; j<size; j++) { var name = results[j].ip; var time = results[j].time; var value = results[j].value; if(series[i].name == name){ series[i].addPoint([(new Date()).getTime(), value], true, true); } } } } }, false); }, 1000*5); } } }, title : { text : 'CPU使用率走势图' //图表标题 }, xAxis : { //设置X轴 type : 'datetime', //X轴为日期时间类型 tickPixelInterval : 75 //X轴标签间隔 }, yAxis : { //设置Y轴 title : 'value', min : 0 //Y轴最小值 }, tooltip : {//当鼠标悬置数据点时的提示框 formatter : function() { //格式化提示信息 return '<b>' + this.series.name + '</b><br/>' + Highcharts.dateFormat('%H:%M:%S', this.x) + '<br/>' + Highcharts.numberFormat(this.y, 2)+ '%'; } }, legend : { // enabled : false, layout: 'vertical', align: 'right', verticalAlign: 'top', // y: 130, borderWidth: 0 //设置图例不可见 }, exporting : { enabled : false //设置导出按钮不可用 }, credits : { enabled: false }, series : create() }); });
重点是chart里面的event属性,series属性。注意,此时:series属性是一个js函数的返回值,需用“js函数名()”来取得。
HighCharts中文网demo里面,series是这样的:
series: [{ name: 'Random data', data: (function() { // generate an array of random data var data = [], time = (new Date()).getTime(), i; for (i = -19; i <= 0; i++) { data.push({ x: time + i * 1000, y: Math.random() }); } return data; })() }]
这时,图表中只有一条折线,且x、y轴数据都不能确定,需要在这里添加ajax方法从后台获取数据,从而决定图表折线(曲线)条数,x、y轴数据等。所以就用到了create()方法。如下所示:
function create() { var series = new Array(); $.ajax({ type: "POST", url: "/cpuMemmaryMonitor/selectCpuDatas.do?userid="+userid", async: false, //表示同步,如果要得到ajax处理完后台数据后的返回值,最好这样设置 success: function(result){ results = eval("(" + result + ")"); var size = results.length; for(var i=0; i<size; i++) { var name = results[i].ip; var time = results[i].time; var value = results[i].value; // var date2 = new Date(time); //将时间转化为时间戳 // var time_str = date2.getTime(); var data = function() { var data = [], // time = result.time,//x轴数据由后台决定。 time = (new Date()).getTime(), i; for(i=-59; i<=0; i++) { data.push({ x: time + i * 5000, y: value }); } return data; }(); series.push({"name": name, "data": data}); } } }, false); //false表示“遮罩”,前台不显示“请稍后”进度提示 return series; }
上面代码块中的:series.push({“name”: name, “data”: data});就是在series【】数组中添加数据,且通过根据for循环生成多条”曲线”。并放入数据。
而chart里面的event属性, 则是每隔一段时间(1000*5=5s)刷新页面数据,方法主要是通过ajax请求后台,得到相应数据并且处理相应数据后,放到一个数据结构或json对象中。
events : { load : function() { var series = this.series; setInterval(function() { $.ajax({ type: "POST", url: "/cpuMemmaryMonitor/selectCpuDatas.do?userid="+userid", async: false, //表示同步,如果要得到ajax处理完后台数据后的返回值,最好这样设置 success: function(result){ results = eval("(" + result + ")"); var size = results.length; for(var i=0; i<series.length; i++) { for(var j=0; j<size; j++) { var name = results[j].ip; var time = results[j].time; var value = results[j].value; if(series[i].name == name){ series[i].addPoint([(new Date()).getTime(), value], true, true); } } } } }, false); }, 1000*5); } }
效果图:
其中,右侧的图例名称是series[i].name
相关文章推荐
- Android gallery 实现定时滑动并添加动画效果
- 补、C++第八次作业
- Android RecyclerView 使用完全解析 体验艺术般的控件
- css display:table-cell 文字、图片的垂直水平居中
- android接收系统广播
- wcf第1步
- python中的generator(coroutine)浅析和应用
- 使用 NodeJS + Express 從 GET/POST Request 取值 -摘自网络
- CORBA的简单介绍及HelloWorld(zhuan)
- 对寄存器ESP和EBP的一些理解(函数执行之前还做了什么事情?)
- WIFI adb 连接手机
- 2016.6.16笔记(1)-多线程(1)
- 新人离职原因
- jquery-easyui-tab引入页面的问题
- VM虚拟机扩展磁盘容量并挂区该分区
- 常用的正则表达式 数字 邮箱 电话等
- 有关JVM处理Java数组方法的思考
- Deep Learning(深度学习)之(二)Deep Learning的基本思想
- Laravel 5.1 中如何使用模型观察者
- java设计模式