myEcharts.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. var Bar, Line, Pie;
  2. var charts = [];
  3. var chartsObje = {};
  4. var MyECharts = (function() {
  5. //柱状图
  6. var BarTemplate = {
  7. color: ['#3398DB'],
  8. tooltip: {
  9. trigger: 'axis',
  10. axisPointer: {
  11. type: 'shadow'
  12. }
  13. },
  14. grid: {
  15. left: '3%',
  16. right: '4%',
  17. bottom: '3%',
  18. top: 20,
  19. containLabel: true
  20. },
  21. xAxis: [{
  22. type: 'value'
  23. }],
  24. yAxis: [{
  25. type: 'category',
  26. data: [],
  27. axisTick: {
  28. alignWithLabel: true
  29. }
  30. }],
  31. series: [{
  32. name: '',
  33. type: 'bar',
  34. barWidth: '40%',
  35. data: []
  36. }]
  37. };
  38. var BarXxTemplate = {
  39. tooltip: {
  40. trigger: 'axis',
  41. axisPointer: { // 坐标轴指示器,坐标轴触发有效
  42. type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
  43. }
  44. },
  45. xAxis: {
  46. type: 'category',
  47. data: []
  48. },
  49. yAxis: {
  50. type: 'value'
  51. },
  52. series: [
  53. ]
  54. };
  55. //饼图
  56. var PieTemplate = {
  57. //color:['#4cabce','#e5323d'],
  58. tooltip: {},
  59. series: [{
  60. name: 'pie',
  61. type: 'pie',
  62. center: ['50%', '50%'],
  63. label: {
  64. normal: {
  65. textStyle: {
  66. color: '#235894'
  67. }
  68. }
  69. },
  70. labelLine: {
  71. normal: {
  72. lineStyle: {
  73. color: '#3E6C9F'
  74. }
  75. }
  76. },
  77. data: [],
  78. itemStyle: {
  79. normal: {
  80. //opacity: 0.7,
  81. borderWidth: 3
  82. // borderColor:'#6C9FD3'
  83. }
  84. }
  85. }]
  86. };
  87. /*
  88. data:[
  89. {value:335, name:'直接访问',itemStyle:{color:'white'}},
  90. {value:310, name:'邮件营销',itemStyle:{color:'#6C9FD3'}},
  91. {value:234, name:'联盟广告',itemStyle:{color:'white'}},
  92. {value:135, name:'视频广告',itemStyle:{color:'#6C9FD3'}},
  93. {value:1548, name:'搜索引擎',itemStyle:{color:'#6C9FD3'}}
  94. ],
  95. */
  96. //折线图
  97. var LineTemplate = {
  98. tooltip: {
  99. trigger: 'axis'
  100. },
  101. grid: {
  102. left: '3%',
  103. right: '4%',
  104. bottom: '3%',
  105. containLabel: true
  106. },
  107. xAxis: {
  108. type: 'category',
  109. boundaryGap: true, //与左边Y轴相连
  110. data: [] //'周一','周二','周三','周四','周五','周六','周日'
  111. },
  112. yAxis: {
  113. type: 'value'
  114. },
  115. series: [{
  116. type: 'line',
  117. data: [], //11,212,123,15,66....
  118. itemStyle: {
  119. color: "#6C9FD3"
  120. }
  121. }]
  122. };
  123. //初始化需要的参数:
  124. /*
  125. id (string) 必填 默认为big_pie(Dom对象的id)
  126. name (string) 可选 鼠标悬停在统计图上是,tip显示的名字
  127. dataList(List<Map>) 必填 需要有name、value如果没有则传入第二个参数
  128. reName (object) {name:mc,value:zrs} 可选 如果dataList中不含name、value则通过传入这个对象来替换原先dataList的Key
  129. type (string) 'pie'||'line'||'bar' 可选 默认为pie
  130. */
  131. var LineTemplateXx = {
  132. title: {
  133. text: '折线图堆叠'
  134. },
  135. tooltip: {
  136. trigger: 'axis'
  137. },
  138. xAxis: {
  139. type: 'category',
  140. boundaryGap: false,
  141. data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  142. },
  143. yAxis: {
  144. type: 'value'
  145. },
  146. series: [{
  147. name: '邮件营销',
  148. type: 'line',
  149. data: [120, 132, 101, 134, 90, 230, 210]
  150. }, {
  151. name: '联盟广告',
  152. type: 'line',
  153. data: [220, 182, 191, 234, 290, 330, 310]
  154. }]
  155. };
  156. var EChartManager = function(o) {
  157. var seriesType = o.type || 'pie';
  158. var seriesName = o.name || '';
  159. var domID = o.id || 'big_pie';
  160. if (!o.dataList) {
  161. throw "未传入初始化的数据(dataList)";
  162. }
  163. var dataList = o.dataList;
  164. if (o.rename) {
  165. for (var i = 0; i < dataList.length; i++) {
  166. if (o.rename.name) {
  167. if (!dataList[i][o.rename.name]) {
  168. throw o.rename.name + " notFound in " + JSON.stringify(dataList[i]);
  169. }
  170. dataList[i]["name"] = dataList[i][o.rename.name]
  171. }
  172. if (o.rename.value) {
  173. var value = dataList[i][o.rename.value];
  174. if (!value && value != 0) {
  175. throw o.rename.value + " notFound in " + JSON.stringify(dataList[i]);
  176. }
  177. dataList[i]["value"] = value;
  178. }
  179. }
  180. }
  181. var clickFunction = o.clickFunction;
  182. /*var myChart=chartsObje[domID];
  183. if(!myChart){*/
  184. //}
  185. var targetDOM = document.getElementById(domID);
  186. if (targetDOM) {
  187. myChart = echarts.init(targetDOM);
  188. } else {
  189. var myChart = echarts.getInstanceByDom(o.dom)
  190. if (myChart)
  191. myChart.dispose();
  192. myChart = echarts.init(o.dom);
  193. }
  194. charts.push(myChart);
  195. chartsObje[domID] = myChart;
  196. if (clickFunction) {
  197. myChart.on("click", clickFunction);
  198. }
  199. seriesType = seriesType + "";
  200. switch (seriesType) {
  201. case 'pie': //饼状图
  202. Pie = JSON.parse(JSON.stringify(PieTemplate));
  203. this.handlePieData(dataList, seriesName, o);
  204. myChart.setOption(Pie, true, null, o.callback);
  205. break;
  206. case '1': //饼状图
  207. Pie = JSON.parse(JSON.stringify(PieTemplate));
  208. this.handlePieData(dataList, seriesName, o);
  209. myChart.setOption(Pie, true, null, o.callback);
  210. break;
  211. case 'line': //折状图
  212. Line = JSON.parse(JSON.stringify(LineTemplate));
  213. this.handleLineData(dataList, seriesName, o);
  214. myChart.setOption(Line, true, null, o.callback);
  215. break;
  216. case '11': //折状图
  217. Line = JSON.parse(JSON.stringify(LineTemplate));;
  218. this.handleLineData(dataList, seriesName, o);
  219. myChart.setOption(Line, true, null, o.callback);
  220. break;
  221. default:
  222. Bar = JSON.parse(JSON.stringify(BarTemplate));
  223. this.handleBarData(dataList, seriesName, o);
  224. myChart.setOption(Bar, true, null, o.callback);
  225. }
  226. };
  227. EChartManager.prototype = {
  228. handleColor: function(obj, o) {
  229. if (o.color) {
  230. }
  231. },
  232. handlePieData: function(list, seriesName, o) {
  233. this.addOption(Pie, o.optionObj);
  234. var data = [];
  235. for (var i = 0; i < list.length; i++) {
  236. if (!("name" in list[i]) || !("value" in list[i])) {
  237. throw "传入的初始化对象数组dataList应含有name和value";
  238. }
  239. var temp = {};
  240. if (o.color) {
  241. for (var prop in list[i]) {
  242. temp[prop] = list[i][prop];
  243. }
  244. if (o.color[temp["name"]]) {
  245. temp["itemStyle"] = {
  246. color: o.color[temp["name"]]
  247. }
  248. }
  249. } else {
  250. for (var prop in list[i]) {
  251. temp[prop] = list[i][prop];
  252. }
  253. }
  254. data.push(temp);
  255. }
  256. if (o.name) {
  257. Pie["title"] = {};
  258. Pie["title"]["left"] = 30;
  259. Pie["title"]["text"] = o.name;
  260. }
  261. Pie.series[0].data = data;
  262. Pie.series[0].name = seriesName;
  263. },
  264. handleLineData: function(list, seriesName, o) {
  265. var sanjzbOne = list[0].sanjzblist;
  266. if (sanjzbOne && sanjzbOne.length > 0) {
  267. Line = JSON.parse(JSON.stringify(LineTemplateXx));
  268. this.addOption(Line, o.optionObj);
  269. Line.title.text=o.name;
  270. Line.xAxis.data=[];
  271. Line.series=[];
  272. var names=[];
  273. for (var i = 0; i < list.length; i++) {
  274. var item = list[i];
  275. Line.xAxis.data.push(item.name);
  276. var sanjzbList = item.sanjzblist;
  277. for (var j = 0; j < sanjzbList.length; j++) {
  278. var sanItem = sanjzbList[j];
  279. if (names.indexOf(sanItem.mc)==-1) {
  280. var series = {
  281. name: sanItem.mc,
  282. type: 'line',
  283. data: []
  284. };
  285. Line.series.push(series);
  286. names.push(sanItem.mc);
  287. }
  288. }
  289. }
  290. for (var i = 0; i < list.length; i++) {
  291. var item = list[i];
  292. var sanjzbList = item.sanjzblist;
  293. for (var seriesIndex in Line.series) {
  294. var seriesItem=Line.series[seriesIndex];
  295. var name=seriesItem.name;
  296. var setSl = false;
  297. for (var j = 0; j < sanjzbList.length; j++) {
  298. var sanItem = sanjzbList[j];
  299. if (name == sanItem.mc) {
  300. setSl = true;
  301. seriesItem.data.push(sanItem.sl);
  302. break;
  303. }
  304. }
  305. if (setSl == false) {
  306. seriesItem.data.push(0);
  307. }
  308. }
  309. }
  310. } else {
  311. this.addOption(Line, o.optionObj);
  312. var seriesData = [];
  313. var xAxisData = [];
  314. for (var i = 0; i < list.length; i++) {
  315. if (!("name" in list[i]) || !("value" in list[i])) {
  316. throw "传入的初始化对象数组dataList应含有name和value";
  317. }
  318. var temp = {};
  319. for (var prop in list[i]) {
  320. temp[prop] = list[i][prop];
  321. if (prop == 'name') {
  322. xAxisData.push(list[i][prop]);
  323. }
  324. }
  325. seriesData.push(temp);
  326. }
  327. if (o.name) {
  328. Line["title"] = {};
  329. Line["title"]["left"] = 30;
  330. Line["title"]["text"] = o.name;
  331. }
  332. Line.xAxis.data = xAxisData;
  333. Line.series[0].data = seriesData;
  334. Line.series[0].name = seriesName;
  335. }
  336. },
  337. handleBarData: function(list, seriesName, o) {
  338. var sanjzbOne = list[0].sanjzblist;
  339. if (sanjzbOne && sanjzbOne.length > 0) {
  340. Bar = JSON.parse(JSON.stringify(BarXxTemplate));
  341. this.addOption(Bar, o.optionObj);
  342. var xAxisData = [];
  343. var obj = {};
  344. Bar.xAxis.data = [];
  345. Bar.series = [];
  346. for (var i = 0; i < list.length; i++) {
  347. var item = list[i];
  348. xAxisData.push(item.name);
  349. var sanjzbList = item.sanjzblist;
  350. for (var j = 0; j < sanjzbList.length; j++) {
  351. var sanItem = sanjzbList[j];
  352. if (!obj[sanItem.mc]) {
  353. var series = {
  354. name: sanItem.mc,
  355. type: 'bar',
  356. stack: '总量',
  357. data: []
  358. };
  359. obj[sanItem.mc] = series;
  360. }
  361. }
  362. }
  363. for (var i = 0; i < list.length; i++) {
  364. var item = list[i];
  365. var sanjzbList = item.sanjzblist;
  366. for (var mc in obj) {
  367. var setSl = false;
  368. for (var j = 0; j < sanjzbList.length; j++) {
  369. var sanItem = sanjzbList[j];
  370. if (mc == sanItem.mc) {
  371. setSl = true;
  372. obj[sanItem.mc].data.push(sanItem.sl);
  373. break;
  374. }
  375. }
  376. if (setSl == false) {
  377. obj[mc].data.push(0);
  378. }
  379. }
  380. }
  381. Bar.xAxis.data = xAxisData;
  382. for (var key in obj) {
  383. Bar.series.push(obj[key]);
  384. }
  385. } else {
  386. Bar = JSON.parse(JSON.stringify(BarTemplate));
  387. this.addOption(Bar, o.optionObj);
  388. var seriesData = [];
  389. var yAxisData = [];
  390. for (var i = 0; i < list.length; i++) {
  391. if (!("name" in list[i]) || !("value" in list[i])) {
  392. throw "传入的初始化对象数组dataList应含有name和value";
  393. }
  394. var temp = {};
  395. for (var prop in list[i]) {
  396. temp[prop] = list[i][prop];
  397. if (prop == 'name') {
  398. yAxisData.push(list[i][prop]);
  399. }
  400. }
  401. seriesData.push(temp);
  402. }
  403. Bar.yAxis[0].data = [];
  404. Bar.series[0].data = [];
  405. Bar.series[0].name = [];
  406. Bar.yAxis[0].data = yAxisData;
  407. Bar.series[0].data = seriesData;
  408. Bar.series[0].name = seriesName;
  409. }
  410. if (o.name) {
  411. Bar["title"] = {};
  412. Bar["title"]["left"] = 30;
  413. Bar["title"]["text"] = o.name;
  414. }
  415. },
  416. addOption: function(oldOption, newOption) {
  417. if (!newOption) {
  418. return;
  419. }
  420. oldOption = Object.assign(oldOption, newOption);
  421. }
  422. };
  423. return {
  424. init: function(o) {
  425. var obj = new EChartManager(o);
  426. }
  427. };
  428. })();