chartsTest.html 26 KB

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