charts.html 25 KB

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