chartsMore.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <title>ECharts</title>
  7. <link rel="stylesheet" href="css/jquery-labelauty.css">
  8. <style>
  9. ul {
  10. list-style-type: none;
  11. }
  12. li {
  13. display: inline-block;
  14. }
  15. li {
  16. margin: 10px 0;
  17. }
  18. input.labelauty + label {
  19. font: 10px "Microsoft Yahei";
  20. }
  21. </style>
  22. <script src="JS/echarts.js"></script>
  23. <script src="JS/jquery-3.4.1.js"></script>
  24. <script src="JS/jquery-labelauty.js"></script>
  25. </head>
  26. <body>
  27. <ul class="dowebok">
  28. <li><input type="radio" name="radio" value="pie" data-labelauty="饼图"></li>
  29. <li><input type="radio" name="radio" value="radius" data-labelauty="环图"></li>
  30. <li><input type="radio" name="radio" value="bar" data-labelauty="柱形图"></li>
  31. <li><input type="radio" name="radio" value="line" data-labelauty="折线图"></li>
  32. <li><input type="radio" name="radio" value="stack" data-labelauty="堆叠图"></li>
  33. </ul>
  34. <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
  35. <div id="main" style="width:100%;height:350px;"></div>
  36. <script type="text/javascript">
  37. // 基于准备好的dom,初始化echarts实例
  38. var myChart;
  39. //数据
  40. var json;
  41. //类型
  42. var re=0;
  43. //后台调用,数据加载
  44. function showchart(str, ty) {
  45. $("#main").height($(window).height() - 100);
  46. //if(ty == 'triangle') {
  47. // $("#main").width($(window).height());
  48. //}
  49. myChart = echarts.init(document.getElementById('main'));
  50. //字符串数据转换
  51. json = JSON.parse(str);
  52. //图形加载
  53. show(ty);
  54. //单选框初始状态
  55. $(':radio[value="' + ty+'"]').eq(0).attr("checked", true);
  56. }
  57. //图形加载
  58. function show(type) {
  59. //图形清空
  60. myChart.clear();
  61. //判断图形类型
  62. if (type == 'pie') {
  63. setpie();
  64. }
  65. if (type == 'radius') {
  66. setradius();
  67. }
  68. if (type == 'bar') {
  69. setbar();
  70. }
  71. if (type == 'line') {
  72. setline();
  73. }
  74. if (type == 'stack') {
  75. setstack();
  76. }
  77. if (type == 'triangle') {
  78. re = 1;
  79. $(".dowebok").hide();
  80. settri();
  81. }
  82. //以下为导出图表为图片,延时执行的作用是确保图表数据渲染已经完成
  83. setTimeout(function () {
  84. var img = new Image();
  85. img.src = myChart.getDataURL({
  86. type: "png", pixelRatio: 2, //放大2倍
  87. backgroundColor: '#fff'
  88. });
  89. img.onload = function () {
  90. var canvas = document.createElement("canvas");
  91. canvas.width = img.width;
  92. canvas.height = img.height;
  93. var ctx = canvas.getContext('2d');
  94. ctx.drawImage(img, 0, 0);
  95. var dataURL = canvas.toDataURL('image/png');
  96. jsObj.MessageText = dataURL;
  97. };
  98. }, 1000)
  99. }
  100. //饼图
  101. function setpie() {
  102. var title = [];
  103. var ser = [];
  104. var d = parseInt(100 / json.ListData.length);
  105. var r = parseInt(d / 2);
  106. var radius = parseInt(80 / json.ListData.length);
  107. for (var i = 0; i < json.ListData.length; i++) {
  108. var cen = i * d + r;
  109. var obj = {
  110. name: json.YName,
  111. type: 'pie',
  112. radius: radius+'%',
  113. selectedMode: 'single',
  114. selectedOffset: 10,
  115. center: [cen+'%', '50%'],
  116. data: json.ListData[i],
  117. itemStyle: {
  118. emphasis: {
  119. shadowBlur: 20,
  120. shadowOffsetX: 0,
  121. shadowColor: 'rgba(40, 40, 40, 0.5)',
  122. },
  123. normal: {
  124. shadowBlur: 10,
  125. shadowColor: 'rgba(0,0,0,0.8)',
  126. shadowOffsetY: '10'
  127. }
  128. }
  129. };
  130. ser.push(obj);
  131. var tit = {
  132. text: json.SoursName[i],
  133. top: '10%',
  134. left: cen + '%'
  135. };
  136. title.push(tit);
  137. }
  138. var option = {
  139. title: {
  140. text: json.Title,
  141. //subtext: '副标题',
  142. x: 'center',
  143. textStyle: {
  144. fontSize: 16
  145. }
  146. },
  147. tooltip: {
  148. trigger: 'item',
  149. formatter: "{a} <br/>{b} : {c} ({d}%)"
  150. },
  151. title: title,
  152. legend: {
  153. type: 'scroll',
  154. left: 50,
  155. bottom: 20,
  156. data: json.ListName,
  157. },
  158. series: ser
  159. };
  160. myChart.setOption(option);
  161. }
  162. //环饼图
  163. function setradius() {
  164. var title = [];
  165. var ser = [];
  166. var d = parseInt(100 / json.ListData.length);
  167. var r = parseInt(d / 2);
  168. var radius = parseInt(80 / json.ListData.length);
  169. for (var i = 0; i < json.ListData.length; i++) {
  170. var cen = i * d + r;
  171. var obj = {
  172. name: json.YName,
  173. type: 'pie',
  174. selectedMode: 'single',
  175. selectedOffset: 10,
  176. radius: ['15%', radius + '%'],
  177. center: [cen + '%', '50%'],
  178. data: json.ListData[i],
  179. itemStyle: {
  180. emphasis: {
  181. shadowBlur: 10,
  182. shadowOffsetX: 0,
  183. shadowColor: 'rgba(0, 0, 0, 0.5)'
  184. }
  185. }
  186. };
  187. ser.push(obj);
  188. var tit = {
  189. text: json.SoursName[i],
  190. top: '10%',
  191. left: cen + '%'
  192. };
  193. title.push(tit);
  194. }
  195. var option = {
  196. title: {
  197. text: json.Title,
  198. //subtext: '副标题',
  199. x: 'center',
  200. textStyle: {
  201. fontSize: 16
  202. }
  203. },
  204. tooltip: {
  205. trigger: 'item',
  206. formatter: "{a} <br/>{b} : {c} ({d}%)"
  207. },
  208. title: title,
  209. legend: {
  210. type: 'scroll',
  211. left: 50,
  212. bottom: 20,
  213. data: json.ListName,
  214. },
  215. series: ser
  216. };
  217. myChart.setOption(option);
  218. }
  219. //柱形图
  220. function setbar() {
  221. var ser = [];
  222. for (var k = 0; k < json.SoursName.length; k++) {
  223. var data = [];
  224. for (var j = 0; j < json.ListName.length; j++) {
  225. var val = 0;
  226. for (var i = 0; i < json.ListData[k].length; i++) {
  227. if (json.ListName[j] == json.ListData[k][i].name) {
  228. val = json.ListData[k][i].value;
  229. break;
  230. }
  231. }
  232. data.push(val);
  233. }
  234. var item = {
  235. name: json.SoursName[k],
  236. type: 'bar',
  237. itemStyle: {
  238. normal: {
  239. shadowBlur: 20,
  240. shadowColor: 'rgba(40, 40, 40, 0.5)',
  241. }
  242. },
  243. data: data
  244. };
  245. ser.push(item);
  246. }
  247. var rotate = 0;
  248. for (var i = 0; i < json.ListName.length; i++) {
  249. if (json.ListName[i].length > 5) {
  250. rotate = 40;
  251. break;
  252. }
  253. }
  254. var option = {
  255. title: {
  256. text: json.Title,
  257. top: 5,
  258. left: 'center',
  259. textStyle: {
  260. fontSize: 16
  261. }
  262. },
  263. legend: {
  264. type: 'scroll',
  265. top: 45,
  266. right: '5%',
  267. data: json.SoursName
  268. },
  269. tooltip: {
  270. },
  271. grid: {
  272. top: 95,
  273. left: '3%',
  274. right: '4%',
  275. bottom: '5%',
  276. containLabel: true
  277. },
  278. xAxis: [{
  279. type: 'category',
  280. axisTick: {
  281. show: false,
  282. color: '#707070'
  283. },
  284. axisLabel: {
  285. textStyle: {
  286. fontSize: 10,
  287. color: '#4D4D4D'
  288. },
  289. interval: 0,
  290. rotate: rotate
  291. },
  292. axisLine: {
  293. lineStyle: {
  294. color: '#707070'
  295. }
  296. },
  297. data: json.ListName,
  298. }],
  299. yAxis: {
  300. type: 'value',
  301. name: json.YName,
  302. nameTextStyle: {
  303. fontSize: 10,
  304. color: '#4D4D4D'
  305. },
  306. axisLabel: {
  307. textStyle: {
  308. fontSize: 10,
  309. color: '#4D4D4D'
  310. }
  311. },
  312. axisLine: {
  313. lineStyle: {
  314. color: '#707070'
  315. }
  316. }
  317. },
  318. series: ser
  319. };
  320. // 使用刚指定的配置项和数据显示图表。
  321. myChart.setOption(option);
  322. }
  323. //折线图
  324. function setline() {
  325. var ser = [];
  326. for (var k = 0; k < json.SoursName.length; k++) {
  327. var data = [];
  328. for (var j = 0; j < json.ListName.length; j++) {
  329. var val = 0;
  330. for (var i = 0; i < json.ListData[k].length; i++) {
  331. if (json.ListName[j] == json.ListData[k][i].name) {
  332. val = json.ListData[k][i].value;
  333. break;
  334. }
  335. }
  336. data.push(val);
  337. }
  338. var item = {
  339. name: json.SoursName[k],
  340. type: 'line',
  341. itemStyle: {
  342. normal: {
  343. shadowBlur: 20,
  344. shadowColor: 'rgba(40, 40, 40, 0.5)',
  345. }
  346. },
  347. data: data
  348. };
  349. ser.push(item);
  350. }
  351. var rotate = 0;
  352. for (var i = 0; i < json.ListName.length; i++) {
  353. if (json.ListName[i].length > 5) {
  354. rotate = 40;
  355. break;
  356. }
  357. }
  358. var option = {
  359. title: {
  360. text: json.Title,
  361. top: 5,
  362. left: 'center',
  363. textStyle: {
  364. fontSize: 16
  365. }
  366. },
  367. legend: {
  368. type: 'scroll',
  369. top: 45,
  370. right: '5%',
  371. data: json.SoursName
  372. },
  373. tooltip: {
  374. },
  375. grid: {
  376. top: 95,
  377. left: '3%',
  378. right: '4%',
  379. bottom: '5%',
  380. containLabel: true
  381. },
  382. xAxis: [{
  383. type: 'category',
  384. axisTick: {
  385. show: false,
  386. color: '#707070'
  387. },
  388. axisLabel: {
  389. textStyle: {
  390. fontSize: 10,
  391. color: '#4D4D4D'
  392. },
  393. interval: 0,
  394. rotate: rotate
  395. },
  396. axisLine: {
  397. lineStyle: {
  398. color: '#707070'
  399. }
  400. },
  401. data: json.ListName,
  402. }],
  403. yAxis: {
  404. type: 'value',
  405. name: json.YName,
  406. nameTextStyle: {
  407. fontSize: 10,
  408. color: '#4D4D4D'
  409. },
  410. axisLabel: {
  411. textStyle: {
  412. fontSize: 10,
  413. color: '#4D4D4D'
  414. }
  415. },
  416. axisLine: {
  417. lineStyle: {
  418. color: '#707070'
  419. }
  420. }
  421. },
  422. series: ser
  423. };
  424. // 使用刚指定的配置项和数据显示图表。
  425. myChart.setOption(option);
  426. }
  427. //堆叠图
  428. function setstack() {
  429. var ser = [];
  430. var total=[];
  431. for (var k = 0; k < json.SoursName.length; k++) {
  432. var t=0;
  433. for (var i = 0; i < json.ListData[k].length; i++) {
  434. t = t + parseFloat(json.ListData[k][i].value);
  435. }
  436. total.push(t);
  437. }
  438. for (var j = 0; j < json.ListName.length; j++) {
  439. var data = [];
  440. for (var k = 0; k < json.SoursName.length; k++) {
  441. var val = 0;
  442. for (var i = 0; i < json.ListData[k].length; i++) {
  443. if (json.ListName[j] == json.ListData[k][i].name) {
  444. var v = parseFloat(json.ListData[k][i].value).toFixed(2);
  445. val = (parseFloat(v / total[k] * 100)).toFixed(2);
  446. break;
  447. }
  448. }
  449. data.push(val);
  450. }
  451. var item = {
  452. name: json.ListName[j],
  453. type: 'bar',
  454. stack: '颗粒',
  455. data: data
  456. };
  457. ser.push(item);
  458. }
  459. var option = {
  460. tooltip: {
  461. show: true,
  462. backgroundColor: '#fff',
  463. borderColor: '#ddd',
  464. borderWidth: 1,
  465. textStyle: {
  466. color: '#3c3c3c',
  467. fontSize: 16
  468. },
  469. formatter: function (p) {
  470. console.log(p);
  471. return '名称:' + p.seriesName + '<br>' + '占比:' + p.value + '%';
  472. },
  473. extraCssText: 'box-shadow: 0 0 5px rgba(0, 0, 0, 0.1)'
  474. },
  475. legend: {
  476. type: 'scroll',
  477. data: json.ListName
  478. },
  479. calculable: true,
  480. xAxis: [
  481. {
  482. type: 'value',
  483. max: 100
  484. }
  485. ],
  486. yAxis: [
  487. {
  488. type: 'category',
  489. splitArea: { show: true },
  490. data: json.SoursName
  491. }
  492. ],
  493. series: ser
  494. };
  495. myChart.setOption(option);
  496. }
  497. //三元相图
  498. function getline(ind, json) {
  499. var _lineStyle = { symbol: 'emptyCircle', symbolSize: 4, lineStyle: { normal: { width: 1, type: 'dashed' } }, itemStyle: { normal: { borderWidth: 1 } } };
  500. var list = [];
  501. var item = {
  502. name: '三角边',
  503. type: 'line',
  504. itemStyle: { normal: { color: '#B5C334', barBorderRadius: 5 } },
  505. data: [[0, 0], [50, 50 * 1.732]],
  506. xAxisIndex: ind,
  507. yAxisIndex: ind,
  508. markPoint: {
  509. label: {
  510. normal:
  511. {
  512. show: true,
  513. formatter: json.TopName
  514. }
  515. },
  516. data: [{
  517. coord: [50, 50 * 1.732]
  518. }]
  519. }
  520. };
  521. var newObj1 = JSON.parse(JSON.stringify(item));//左边
  522. list.push(newObj1);
  523. var newObj2 = JSON.parse(JSON.stringify(item));// 右边
  524. newObj2.data = [[50, 50 * 1.732], [100, 0]];
  525. newObj2.markPoint.label.normal.formatter = json.RightName;
  526. newObj2.markPoint.data = [{ coord: [100, 0] }];
  527. list.push(newObj2);
  528. var newObj3 = JSON.parse(JSON.stringify(item));//底边
  529. newObj3.data = [[0, 0], [100, 0]];
  530. newObj3.markPoint.label.normal.formatter = json.LeftName;
  531. newObj3.markPoint.data = [{ coord: [0, 0] }];
  532. list.push(newObj3);
  533. //左‘\’线
  534. for (var i = 1; i < 10; i++) {
  535. for (var j = 0; j < 10; j++) {
  536. var x1 = 5 * i + 5 * j;
  537. var x2 = x1 + 5;
  538. var y1 = 5 * i * 1.732 - 5 * j * 1.732;
  539. var y2 = y1 - 5 * 1.732;
  540. if (y2 < -1) {
  541. break;
  542. }
  543. var line = {
  544. name: '虚线',
  545. type: 'line',
  546. itemStyle: {
  547. normal: {
  548. color: '#B5C334',
  549. barBorderRadius: 5,
  550. }
  551. }, symbol: _lineStyle.symbol,
  552. symbolSize: _lineStyle.symbolSize,
  553. lineStyle: _lineStyle.lineStyle,
  554. itemStyle: _lineStyle.itemStyle,
  555. xAxisIndex: ind,
  556. yAxisIndex: ind,
  557. data: [[x1, y1], [x2, y2]]
  558. };
  559. list.push(line);
  560. }
  561. }
  562. //右‘/’线
  563. for (var i = 9; i > 0; i--) {
  564. for (var j = 0; j < 10; j++) {
  565. var x1 = 100 - (5 * (10 - i) + 5 * j);
  566. var x2 = x1 - 5;
  567. var y1 = 5 * (10 - i) * 1.732 - 5 * j * 1.732;
  568. var y2 = y1 - 5 * 1.732;
  569. if (y2 < -1) {
  570. break;
  571. }
  572. var line = {
  573. name: '虚线',
  574. type: 'line',
  575. itemStyle: {
  576. normal: {
  577. color: '#B5C334',
  578. barBorderRadius: 5,
  579. }
  580. }, symbol: _lineStyle.symbol,
  581. symbolSize: _lineStyle.symbolSize,
  582. lineStyle: _lineStyle.lineStyle,
  583. itemStyle: _lineStyle.itemStyle,
  584. xAxisIndex: ind,
  585. yAxisIndex: ind,
  586. data: [[x1, y1], [x2, y2]]
  587. };
  588. list.push(line);
  589. }
  590. }
  591. //底‘_’线
  592. for (var i = 1; i < 10; i++) {
  593. for (var j = 0; j < 10; j++) {
  594. var x1 = 5 * i + 5 * j;
  595. var x2 = x1 + 10;
  596. var y1 = 5 * i * 1.732 - 5 * j * 1.732;
  597. var y2 = y1;
  598. if (y2 == 0) {
  599. break;
  600. }
  601. var line = {
  602. name: '虚线',
  603. type: 'line',
  604. itemStyle: {
  605. normal: {
  606. color: '#B5C334',
  607. barBorderRadius: 5,
  608. }
  609. }, symbol: _lineStyle.symbol,
  610. symbolSize: _lineStyle.symbolSize,
  611. lineStyle: _lineStyle.lineStyle,
  612. itemStyle: _lineStyle.itemStyle,
  613. xAxisIndex: ind,
  614. yAxisIndex: ind,
  615. data: [[x1, y1], [x2, y2]]
  616. };
  617. list.push(line);
  618. }
  619. }
  620. for (var i = 0; i < json.ListPartSize.length; i++) {
  621. var d1 = {
  622. name: json.ListPartSize[i],
  623. type: 'scatter',
  624. xAxisIndex: ind,
  625. yAxisIndex: ind,
  626. data: json.ListPoint[i]
  627. };
  628. list.push(d1);
  629. }
  630. return list;
  631. }
  632. function settri() {
  633. var ser = [];
  634. for (var i = 0; i < json.length; i++) {
  635. var obj = getline(i, json[i]);
  636. for (var j = 0; j < obj.length; j++) {
  637. ser.push(obj[j]);
  638. }
  639. }
  640. var title = [];
  641. var cen = parseInt(95 / json.length);
  642. for (var i = 0; i < json.length; i++) {
  643. var ti = {
  644. text: json[i].Samplename,
  645. left: (i * cen + 18) + '%',
  646. top: 40,
  647. textAlign: 'center'
  648. };
  649. title.push(ti);
  650. }
  651. var grid = [];
  652. var w = parseInt(($("#main").width() - 20) / json.length);
  653. for (var i = 0; i < json.length; i++) {
  654. var width = cen + '%';
  655. var ti = {
  656. show: false,
  657. left: (i * cen) + '%',
  658. top: 70,
  659. bottom:10,
  660. containLabel: true,
  661. width: width
  662. };
  663. grid.push(ti);
  664. }
  665. var xAxis = [];
  666. var yAxis = [];
  667. for (var i = 0; i < json.length; i++) {
  668. var ti = {
  669. gridIndex: i,
  670. show: false
  671. };
  672. var ty = {
  673. gridIndex: i,
  674. show: false,
  675. min: 'dataMin' // 最小值
  676. };
  677. xAxis.push(ti);
  678. yAxis.push(ty);
  679. }
  680. var dataZoom = [{
  681. type: 'slider',
  682. show: false,
  683. start: 0,
  684. end: 100,
  685. handleSize: 8
  686. },
  687. {
  688. type: 'inside',
  689. start: 0,
  690. end: 100
  691. },
  692. {
  693. type: 'inside',
  694. show: true,
  695. yAxisIndex: 0,
  696. filterMode: 'empty',
  697. width: 1,
  698. height: '70%',
  699. handleSize: 8,
  700. showDataShadow: true,
  701. left: '93%',
  702. start: 0,
  703. end: 100
  704. }];
  705. for (var i = 0; i < json.length; i++) {
  706. var ti = {
  707. type: 'inside',
  708. show: true,
  709. yAxisIndex: i,
  710. filterMode: 'empty',
  711. width: 1,
  712. height: '70%',
  713. handleSize: 8,
  714. showDataShadow: true,
  715. left: '93%',
  716. start: 0,
  717. end: 100
  718. };
  719. dataZoom.push(ti);
  720. }
  721. option = {
  722. title: title,
  723. grid: grid,
  724. legend: {
  725. data: json[0].ListPartSize,
  726. left: 'right',
  727. },
  728. tooltip: {
  729. trigger: 'item',
  730. showDelay: 0,
  731. formatter: function (params) {
  732. return params.seriesName + ' :<br/>'
  733. + params.value[0] + ','
  734. + params.value[1];
  735. }
  736. },
  737. xAxis: xAxis,
  738. yAxis: yAxis,
  739. dataZoom: dataZoom,
  740. series: ser
  741. };
  742. // 使用刚指定的配置项和数据显示图表。
  743. myChart.setOption(option);
  744. }
  745. //窗体改变大小,图形重新加载
  746. window.onresize = function () {
  747. $("#main").height($(window).height() - 100);
  748. //if (re == 1) {
  749. // $("#main").width($(window).height());
  750. //}
  751. myChart.resize();
  752. }
  753. //所有单选绑定单击事件
  754. $(function () {
  755. $(':input').labelauty().on('click', function () {
  756. var typ = $(':radio:checked').val();
  757. show(typ);
  758. });
  759. });
  760. </script>
  761. </body>
  762. </html>