echarts实现一个页面同时显示多个图表

前言:

因工作需要,老大要求给我一个JSON数据,用echarts,写一个option实现多个图表(折线图,饼图,关系图)展示,也就是说只要一个div(dom对象),实现多个不同形状的图表展示,(ps:前期没弄清老大意思,写了三个div来显示-,尴尬--_---)。这里我用了LayUI(表格)+eCharts来,通过引入自定义的js,实现页面效果显示

自己在网上找了下,没有找到对应的文章,直接来说怎么实现,所以特意写了此文章,共同学习。

总结技巧:

1.先用最少的代码显示出一个图(eg:饼图只要一个series就可以显示出来)

      2.【关键点】自己能控制每个图在自己指定的地方的显示(eg:饼图通过配置center来确定中心位置,radius确定饼图的大小,控制饼图显示在:右上角,中间,左下角)。

 
  1. option = {//简单的 折线图+饼图 展示

  2. grid: [

  3. {x: '7%', y: '7%', width: '38%', height: '38%'},//折线图位置控制

  4. ],

  5. xAxis: [

  6. {gridIndex: 0,type: 'category',

  7. data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']},

  8. ],

  9. yAxis: [

  10. {gridIndex: 0 },

  11. ],

  12. series: [

  13. {

  14. type: 'line',

  15. xAxisIndex: 0,

  16. yAxisIndex: 0,

  17. data: [1,2,3,4,5],

  18. },

  19. {

  20. type: 'pie',

  21. radius : '45%',

  22. center: ['80%', '30%'],//饼图位置控制

  23. data: [1,2,3,4,5],

  24. },

  25. ]

  26. };

   3.确定了每个图位置,整体布局好了,再来添加每个图需要的功能点

   4.关系图每个节点的位置确定:通过笛卡尔积坐标系+节点的value[x,y]实现(我这用的是之字形显示节点)。

 

eCharts链接(在线修改):http://gallery.echartsjs.com/editor.html?c=xHJUB4SZmz&v=1

官方例子:http://www.echartsjs.com/gallery/editor.html?c=scatter-anscombe-quartet

官例调试技巧点:通过修改删除:series (xAxisIndex), yAxis(gridIndex) ,grid(x,x2,y,y2),查看效果了解参数(可先看配置项手册)

效果图:

 

echarts实现一个页面同时显示多个图表

前台html页面代码:

 
  1. <!DOCTYPE>

  2. <html>

  3. <head>

  4. <meta charset="utf-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1" />

  6.  
  7. <!-- 复制演示:都修改成自己的路径 -->

  8. <!-- 引入echarts的js库 -->

  9. <script src="../../dist/echarts.js"></script>

  10.  
  11. <!-- 引入自定义的js(同文件夹下) -->

  12. <script type="text/javascript" src="oneForAll.js"></script>

  13.  
  14. <style type="text/css">body{height: 100%}

  15. /*通过百分比设置图表的div大小*/

  16. .chart{height: 70%}

  17. </style>

  18.  
  19. <!-- 引入layui库 -->

  20. <link rel="stylesheet" href="layui/css/layui.css" media="all">

  21. <script src="layui/layui.js" charset="utf-8"></script>

  22. <script src="layui/yqyTable.js" charset="utf-8"></script>

  23.  
  24. </head>

  25. <body>

  26. <!-- echarts图表数据对象 -->

  27. <div class="chart" id="yqyMain" ></div>

  28.  
  29. <script>

  30. //固定写法

  31. var chart = echarts.init(document.getElementById('yqyMain'));

  32. /*接受自定义Option.js中的函数返回的:option*/

  33. var yqyOption=oneForAll();

  34. chart.setOption(yqyOption);

  35.  
  36. </script>

  37.  
 

[html] view plain copy

  1.   
 
  1. <!-- layui选项卡界面:如不需要整合表格=可忽略 -->

  2. <div class="layui-tab">

  3.  
  4. <ul class="layui-tab-title">

  5. <li class="layui-this">基本信息</li>

  6. <li>服务信息</li>

  7. <li>关系信息</li>

  8. </ul>

  9.  
  10. <div class="layui-tab-content">

  11.  
  12. <div class="layui-tab-item layui-show">

  13. <!-- 表格数据 -->

  14. <table id="sysVolTable"></table>

  15. <!-- 序号自增:翻页有小问题,点击下一页又从1开始计数,待改进 -->

  16. <script type="text/html" id="indexTp1">

  17. {{d.LAY_TABLE_INDEX+1}}

  18. </script>

  19. </div>

  20.  
  21. <div class="layui-tab-item ">服务纬度</div>

  22. <div class="layui-tab-item ">关系数</div>

  23.  
  24. </div>

  25. </div>

  26. <!-- 选项卡:功能性设置 -->

  27. <script>

  28. layui.use('element',function(){

  29. var element=layui.element;

  30. });

  31. </script>

  32. </body>

  33. </html>

js代码:

 

[html] view plain copy

  1. <code class="language-html">文件名:oneForAll.js</code>  
 
 
  1. //饼图数据

  2. pieData=[[{"name":"A系统","value":2},{"name":"B系统","value":4},{"name":"C系统","value":3},{"name":"D系统","value":3},{"name":"E系统","value":7},{"name":"F系统","value":3},{"name":"G系统","value":3},{"name":"H系统","value":3}],["A系统","B系统","C系统","D系统","E系统","F系统","G系统","H系统"]];

  3.  
  4. //折线图数据

  5. yqyData=[[0,1,2,3,4,5,6,7,8,9,10,11,12],[600,1150,400,850,600,650,100,1150,100,700,600,800,500]]

  6.  
  7. //---------------------------------------------关系图数据获取:start,有点多,可先忽略查看----------------------------------------------------------

  8.  
  9. //用java代码:自动生成关系图数据(因为前期,没有理解需求——_——:全是自己用java自动生成的json数据)

  10. relatData=[{"node":"系统节点1","endpoint":["系统节点3"],"service":["java.local.name_1","java.local.name_11"]},{"node":"系统节点2","endpoint":["系统节点3","系统节点1"],"service":["java.local.name_2","java.local.name_22"]},{"node":"系统节点3","endpoint":["系统节点4","系统节点2"],"service":["java.local.name_3","java.local.name_33"]},{"node":"系统节点4","endpoint":["系统节点3"],"service":["java.local.name_4","java.local.name_44"]},{"node":"系统节点5","endpoint":["系统节点2"],"service":["java.local.name_5","java.local.name_55"]},{"node":"系统节点6","endpoint":["系统节点3"],"service":["java.local.name_6","java.local.name_66"]},{"node":"系统节点7","endpoint":["系统节点2"],"service":["java.local.name_7","java.local.name_77"]},{"node":"系统节点8","endpoint":["系统节点2"],"service":["java.local.name_8","java.local.name_88"]}];

  11.  
  12. //获取节点数据

  13. function get_nodes(relatData) {//官方的方法改造了一下=自定义生成:关系图中节点位置

  14. var nodes = [];

  15. var tmp_nodes = [];

  16. var x1=1200;

  17. var y1=100;

  18.  
  19. for(var nodes_i in relatData) {

  20. //x,y数据归位

  21. x1=5;

  22. y1=5;

  23. //三个节点为一排,之字形增加

  24. x1=x1+10*(nodes_i%3);//保持0,1,2

  25. y1=y1+10*Math.floor(nodes_i/3);//向下取整

  26.  
  27. console.log("x1="+x1+" y1="+y1);

  28. console.log("x1="+(nodes_i%3)+" y1="+(Math.floor(nodes_i/3)));

  29. tmp_nodes.push(relatData[nodes_i].node);

  30. nodes.push(

  31. {

  32.  
  33. 'name':relatData[nodes_i].node,

  34. 'value':[x1,y1]//4.通过x,y来确定关系图的节点位置

  35. }

  36. );

  37. }

  38. return nodes;

  39. }

  40.  
  41. //获取节点数据关系

  42. function get_links(relatData) {

  43. var links = [];

  44. for(var nodes_i in relatData) {

  45. var node = relatData[nodes_i].node;

  46. var endpoint = relatData[nodes_i].endpoint;

  47. var service = relatData[nodes_i].service;

  48. // console.log(service);

  49. for(var service_i in endpoint) {

  50. links.push({

  51. 'source':node,

  52. 'target':endpoint[service_i],

  53. 'label': {

  54. 'normal': {

  55. 'show': false,

  56. 'textStyle':{

  57. 'fontSize':5

  58. },

  59. 'formatter': service

  60. }

  61. },

  62. 'lineStyle': {

  63. 'normal': {

  64. 'curveness': 0.1

  65. }

  66. }

  67. })

  68. }

  69. }

  70. for (var i = 0, len1 = links.length; i < len1; i++) {

  71. for(var j = i, len2 = len1 - 1; j < len2; j++) {

  72. if (links[i].source==links[j].target) {

  73. links[j].lineStyle.normal.curveness = -0.1;

  74. }

  75. }

  76. }

  77. // console.log(links);

  78. return links;

  79. }

  80. //------------------------------------------------------关系图获取数据:end-----------------------------------------------------------------

  81.  
  82. //按老大要求:多个图表数据整合成一个option

  83. //【关键点】:1.用最少的代码显示出一个图(eg:饼图只要一个series就可以显示出来)

  84. //2.确定每个图表的位置,占的区域(eg:饼图通过配置center来确定中心位置,radius确定饼图的大小)。

  85. function oneForAll(){

  86.  
  87. //我选折线图作为基础option

  88. var yqyOption = {

  89. xAxis: [

  90. {data: yqyData[0],gridIndex:0},//折线图x轴数据赋值,指定坐标信息

  91. {gridIndex:1,type:'value'}

  92. ],

  93. yAxis: [

  94. {

  95. name:'交易量',

  96. splitLine: {show: false},

  97. gridIndex:0

  98. },

  99. {gridIndex:1,type:'value'}

  100. ],

  101.  
  102. grid:[//指定坐标轴位置,大小

  103. {x:'7%',y:'7%',width:'50%',height:'31%'},

  104. {x:'60%',bottom:'1%',height:'90%',width:'35%',contianLabel:true}//关系图位置

  105. ],

  106.  
  107. series: [{

  108. type: 'line',

  109. xAxisIndex:0,//指定折线图数据显示到:grid坐标系:0

  110. yAxisIndex:0,

  111. showSymbol: false,

  112. data: yqyData[1]//折线图y轴数据赋值

  113. }]

  114. };

  115.  
  116. //======饼图数据1=====

  117. var pieSeries1={

  118. name : '面积模式',

  119. type : 'pie',

  120. radius : [ 10, 80 ],

  121. center : [ '18%', '75%' ],//位置确定:左下角

  122. data :pieData[0]//饼图数据赋值

  123. };

  124.  
  125. //======饼图数据2=====

  126. var pieSeries2={

  127. name : '面积模式',

  128. type : 'pie',

  129. radius : [ 10, 80 ],

  130. center : [ '47%', '75%' ],

  131. roseType : 'area',//zxj玫瑰饼图

  132. data :pieData[0]

  133. };

  134.  
  135. //将饼图series添加到主series中

  136. yqyOption.series.push(pieSeries1);//完成了一个简单的折线图和饼图的数据合并

  137. yqyOption.series.push(pieSeries2);

  138.  
  139. //关系图数据

  140. var relatSeries =

  141. {

  142. type: 'graph',

  143. // layout: 'circular',

  144. layout: 'force',//1.力引导图

  145. coordinateSystem:'cartesian2d',//2.笛卡尔坐标系设置

  146. xAxisIndex:1,//3.选取的第二个坐标系,为关系图数据位置,4.value值设置

  147. yAxisIndex:1,

  148. focusNodeAdjacency: true,

  149. legendHoverLink: true,

  150. hoverAnimation:true,

  151. symbolSize: 30,

  152. edgeSymbolSize: 10,

  153. roam: true,

  154. symbol: "roundRect",

  155. label: {

  156. normal: {

  157. show: true,

  158. }

  159. },

  160. edgeSymbol: ['circle', 'arrow'],

  161. edgeSymbolSize: [4, 15],

  162. edgeLabel: {

  163. normal: {

  164. textStyle: {

  165. fontSize: 20

  166. }

  167. }

  168. },

  169. data: get_nodes(relatData),//节点数据赋值

  170. links: get_links(relatData),

  171.  
  172. lineStyle: {

  173. normal: {

  174. opacity: 0.9,

  175. width: 2,

  176. curveness: 0,

  177. type :'dashed'

  178. }

  179. }

  180. };

  181.  
  182. //将关系图添加到主series中

  183. yqyOption.series.push(relatSeries);

  184.  
  185. return yqyOption;

  186. }

LayUI表格js

 
 

注意需要最前面添加分号  ;

 

[html] view plain copy

  1. <code class="language-html">yqyTable.js</code>  
 
 
 
  1. ;layui.use('table', function(){

  2. var table = layui.table;

  3. table.render({

  4. elem: '#sysVolTable',

  5. page: {limit:1},//指定分页

  6. data: [{

  7. "srcIp": "192.168.0.1",

  8. "srcSys": "SRC",

  9. "destIp": "192.168.0.8",

  10. "destSys": "DEST",

  11. "startTime": "2017-12-25 9:31",

  12. "endTime": "2017-12-25 9:31",

  13. "remark":"yqy测试数据"

  14. },{

  15. "srcIp": "192.168.0.1",

  16. "srcSys": "SRC",

  17. "destIp": "192.168.0.7",

  18. "destSys": "DEST",

  19. "startTime": "2017-12-27 18:31",

  20. "endTime": "2017-12-27 18:31",

  21. "remark":"yqy测试数据"

  22. }],

  23. cols: [[

  24. {title:'序号',templet:'#indexTp1', width:'6%'},

  25. {field:'srcIp', title:'IP', width:'17%',sort:true},

  26. {field:'srcSys', title:'源系统', width:'10%'},

  27. {field:'destIp', title:'目标IP', width:'17%'},

  28. {field:'destSys', title:'目标系统', width:'10%'},

  29. {field:'startTime', title:'开始时间', width:'11%'},

  30. {field:'endTime', title:'结束时间', width:'11%'},

  31. {field:'remark', title:'备注'}

  32. ]]

  33. });

  34. });