最近一直比较头疼,如何实现realtime图。总结一下需要解决以下问题:
1.如何传输自定义数据
2.数据要以什么格式传输
3.是否能够进行局部刷新,也就是ajax请求或者其他方式
4.同一页面上是否能够异步刷新不同的div,如果div多的话,会不会很慢
5.实现realtime图的机制是什么,是否可以自定制
一直研究的echarts前不久刚更新adddata的实时数据接口。所以自己单独抽出来做了个实验。源代码如下:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>mix 2 个图表的效果</title> <script src="js/esl.js"></script> <script src="js/jquery-1.7.1.js"></script> <script type="text/javascript"> /** 实验 2个动态图展示,变化方式不同 */ require.config({ packages:[ { name:'echarts', location:'echarts-master/src', main:'echarts' }, { name:'zrender', location:'zrender-master/src', main:'zrender' } ] }); var option1 = { title : { text: '上季度温度变化', subtext: '纯属虚构' }, tooltip : { trigger: 'axis' }, legend: { data:['平均气温'] }, calculable : true, xAxis : [ { type : 'category', boundaryGap : false, data : (function(){ var res = []; var len = 100; while (len--) { res.push(len + 1); } return res; })() } ], yAxis : [ { type : 'value', axisLabel : { formatter: '{value} °C' }, splitArea : {show : true} } ], series : [ { name:'平均气温', type:'line', smooth:false, itemStyle: { normal: { color:'#00fa9a', areaStyle: { shadowColor : 'rgba(0,0,0,0.4)' } } }, data:dataXRand() } ] }; var option2 = { title : { text: '本季度温度变化化', subtext: '纯属虚构' }, tooltip : { trigger: 'axis' }, legend: { data:['最高气温'] }, calculable : true, xAxis : [ { type : 'category', boundaryGap : false, data : (function(){ var res = []; var len = 100; while (len--) { res.push(len + 1); } return res; })() } ], yAxis : [ { type : 'value', axisLabel : { formatter: '{value} °C' }, splitArea : {show : true} } ], series : [ { name:'最高气温', type:'line', smooth:false, itemStyle: { normal: { areaStyle: { shadowColor : 'rgba(0,0,0,0.4)' } } }, data:dataXRand() } ] }; var myChart1; var myChart2; require( [ 'echarts', 'echarts/chart/line' ], function(ec){ myChart1=ec.init(document.getElementById('main1')); myChart1.setOption(option1); var timeTicket1; clearInterval(timeTicket1); timeTicket1 = setInterval(function(){ RandANum1(ec); }, 300); myChart2=ec.init(document.getElementById('main2')); myChart2.setOption(option2); var timeTicket2; clearInterval(timeTicket2); timeTicket2 = setInterval(function(){ RandANum2(ec); }, 100); } ) function RandANum1(ec){ $.ajax({ url:"./control/AjaxService.php?method=RandANum", dataType:"text", success:function(data) { Rdata=eval(data); myChart1.addData([ [ 0, // 系列索引 Rdata, // 新增数据 false, // 新增数据是否从队列头部插入 false, // 是否增加队列长度,false则自定删除原有数据,队头插入删队尾,队尾插入删队头 // axisData // 坐标轴标签 ] ]); } }); } function RandANum2(ec){ $.ajax({ url:"./control/AjaxService.php?method=RandANum2", dataType:"text", success:function(data) { Rdata=eval(data); myChart2.addData([ [ 0, // 系列索引 Rdata, // 新增数据 false, // 新增数据是否从队列头部插入 false, // 是否增加队列长度,false则自定删除原有数据,队头插入删队尾,队尾插入删队头 // axisData // 坐标轴标签 ] ]); } }); } function dataXRand(){ var dataarr=new Array(); $.ajax({ url:"./control/AjaxService.php?method=RandTest", dataType:"text", success:function(data) { var ss=eval(data); for(var i=0;i<ss.length;i++) { dataarr.push(ss[i]); //alert(dataarr[i]); } } }); return dataarr; } </script> </head> <body> <div id="main1" style="height:220px; border:1px solid #ccc; padding:10px;"></div> <div id="main2" style="height:220px; border:1px solid #ccc; padding:10px;"></div> </body> </html>
针对上述5个问题的回答如下:
数据可以存在数据库或者在线,as you like,可以通过AJAX或者jquery库等获得JSON数据然后转成数组,传输给echarts。一般最常用的是json格式。不管是ajax、jsonp甚至websocket都可以作为获取数据的方式,这是数据层面的事情不会附加到图表中,你当然可以通过ajax获取数据后展现,我们的实际应用中基本都是ajax数据~图表提供了loading方法用于获取数据时作为过渡显示~
实时图数据一般不会从数据库里面读取,所以用php做了一个随机数的生成函数。代码很简单不解释。效果图如下:
下面的文章会贴上实现的具体代码。