dynamic-loaded-chart.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  7. <title>Dynamic Loaded Column Chart</title>
  8. <link href="../../assets/styles.css" rel="stylesheet" />
  9. <style>
  10. body {
  11. background: #fff;
  12. }
  13. #wrap {
  14. margin: 45px auto;
  15. max-width: 800px;
  16. position: relative;
  17. }
  18. .chart-box {
  19. padding-left: 0;
  20. }
  21. #chart-year,
  22. #chart-quarter {
  23. width: 96%;
  24. max-width: 48%;
  25. box-shadow: none;
  26. padding-left: 0;
  27. padding-top: 20px;
  28. background: #fff;
  29. border: 1px solid #ddd;
  30. }
  31. #chart-year {
  32. float: left;
  33. position: relative;
  34. transition: 1s ease transform;
  35. z-index: 3;
  36. }
  37. #chart-year.chart-quarter-activated {
  38. transform: translateX(0);
  39. transition: 1s ease transform;
  40. }
  41. #chart-quarter {
  42. float: left;
  43. position: relative;
  44. z-index: -2;
  45. transition: 1s ease transform;
  46. }
  47. #chart-quarter.active {
  48. transition: 1.1s ease-in-out transform;
  49. transform: translateX(0);
  50. z-index: 1;
  51. }
  52. @media screen and (min-width: 480px) {
  53. #chart-year {
  54. transform: translateX(50%);
  55. }
  56. #chart-quarter {
  57. transform: translateX(-50%);
  58. }
  59. }
  60. select#model {
  61. display: none;
  62. position: absolute;
  63. top: -40px;
  64. left: 0;
  65. z-index: 2;
  66. cursor: pointer;
  67. transform: scale(0.8);
  68. }
  69. </style>
  70. <script>
  71. window.Promise ||
  72. document.write(
  73. '<script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js"><\/script>'
  74. )
  75. window.Promise ||
  76. document.write(
  77. '<script src="https://cdn.jsdelivr.net/npm/eligrey-classlist-js-polyfill@1.2.20171210/classList.min.js"><\/script>'
  78. )
  79. window.Promise ||
  80. document.write(
  81. '<script src="https://cdn.jsdelivr.net/npm/findindex_polyfill_mdn"><\/script>'
  82. )
  83. </script>
  84. <script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
  85. <script>
  86. Apex = {
  87. chart: {
  88. toolbar: {
  89. show: false
  90. }
  91. },
  92. tooltip: {
  93. shared: false
  94. },
  95. legend: {
  96. show: false
  97. }
  98. }
  99. var colors = ['#008FFB', '#00E396', '#FEB019', '#FF4560', '#775DD0', '#00D9E9', '#FF66C3'];
  100. /**
  101. * Randomize array element order in-place.
  102. * Using Durstenfeld shuffle algorithm.
  103. */
  104. function shuffleArray(array) {
  105. for (var i = array.length - 1; i > 0; i--) {
  106. var j = Math.floor(Math.random() * (i + 1));
  107. var temp = array[i];
  108. array[i] = array[j];
  109. array[j] = temp;
  110. }
  111. return array;
  112. }
  113. var arrayData = [{
  114. y: 400,
  115. quarters: [{
  116. x: 'Q1',
  117. y: 120
  118. }, {
  119. x: 'Q2',
  120. y: 90
  121. }, {
  122. x: 'Q3',
  123. y: 100
  124. }, {
  125. x: 'Q4',
  126. y: 90
  127. }]
  128. }, {
  129. y: 430,
  130. quarters: [{
  131. x: 'Q1',
  132. y: 120
  133. }, {
  134. x: 'Q2',
  135. y: 110
  136. }, {
  137. x: 'Q3',
  138. y: 90
  139. }, {
  140. x: 'Q4',
  141. y: 110
  142. }]
  143. }, {
  144. y: 448,
  145. quarters: [{
  146. x: 'Q1',
  147. y: 70
  148. }, {
  149. x: 'Q2',
  150. y: 100
  151. }, {
  152. x: 'Q3',
  153. y: 140
  154. }, {
  155. x: 'Q4',
  156. y: 138
  157. }]
  158. }, {
  159. y: 470,
  160. quarters: [{
  161. x: 'Q1',
  162. y: 150
  163. }, {
  164. x: 'Q2',
  165. y: 60
  166. }, {
  167. x: 'Q3',
  168. y: 190
  169. }, {
  170. x: 'Q4',
  171. y: 70
  172. }]
  173. }, {
  174. y: 540,
  175. quarters: [{
  176. x: 'Q1',
  177. y: 120
  178. }, {
  179. x: 'Q2',
  180. y: 120
  181. }, {
  182. x: 'Q3',
  183. y: 130
  184. }, {
  185. x: 'Q4',
  186. y: 170
  187. }]
  188. }, {
  189. y: 580,
  190. quarters: [{
  191. x: 'Q1',
  192. y: 170
  193. }, {
  194. x: 'Q2',
  195. y: 130
  196. }, {
  197. x: 'Q3',
  198. y: 120
  199. }, {
  200. x: 'Q4',
  201. y: 160
  202. }]
  203. }];
  204. function makeData() {
  205. var dataSet = shuffleArray(arrayData)
  206. var dataYearSeries = [{
  207. x: "2011",
  208. y: dataSet[0].y,
  209. color: colors[0],
  210. quarters: dataSet[0].quarters
  211. }, {
  212. x: "2012",
  213. y: dataSet[1].y,
  214. color: colors[1],
  215. quarters: dataSet[1].quarters
  216. }, {
  217. x: "2013",
  218. y: dataSet[2].y,
  219. color: colors[2],
  220. quarters: dataSet[2].quarters
  221. }, {
  222. x: "2014",
  223. y: dataSet[3].y,
  224. color: colors[3],
  225. quarters: dataSet[3].quarters
  226. }, {
  227. x: "2015",
  228. y: dataSet[4].y,
  229. color: colors[4],
  230. quarters: dataSet[4].quarters
  231. }, {
  232. x: "2016",
  233. y: dataSet[5].y,
  234. color: colors[5],
  235. quarters: dataSet[5].quarters
  236. }];
  237. return dataYearSeries
  238. }
  239. function updateQuarterChart(sourceChart, destChartIDToUpdate) {
  240. var series = [];
  241. var seriesIndex = 0;
  242. var colors = []
  243. if (sourceChart.w.globals.selectedDataPoints[0]) {
  244. var selectedPoints = sourceChart.w.globals.selectedDataPoints;
  245. for (var i = 0; i < selectedPoints[seriesIndex].length; i++) {
  246. var selectedIndex = selectedPoints[seriesIndex][i];
  247. var yearSeries = sourceChart.w.config.series[seriesIndex];
  248. series.push({
  249. name: yearSeries.data[selectedIndex].x,
  250. data: yearSeries.data[selectedIndex].quarters
  251. })
  252. colors.push(yearSeries.data[selectedIndex].color)
  253. }
  254. if (series.length === 0) series = [{
  255. data: []
  256. }]
  257. return ApexCharts.exec(destChartIDToUpdate, 'updateOptions', {
  258. series: series,
  259. colors: colors,
  260. fill: {
  261. colors: colors
  262. }
  263. })
  264. }
  265. }
  266. </script>
  267. </head>
  268. <body>
  269. <div id="wrap">
  270. <select id="model" class="flat-select"
  271. >
  272. <option value="iphone5">iPhone 5</option>
  273. <option value="iphone6">iPhone 6</option>
  274. <option value="iphone7">iPhone 7</option>
  275. </select>
  276. <div id="chart-year"></div>
  277. <div id="chart-quarter"></div>
  278. </div>
  279. <script>
  280. var options = {
  281. series: [{
  282. data: makeData()
  283. }],
  284. chart: {
  285. id: 'barYear',
  286. height: 400,
  287. width: '100%',
  288. type: 'bar',
  289. events: {
  290. dataPointSelection: function (e, chart, opts) {
  291. var quarterChartEl = document.querySelector("#chart-quarter");
  292. var yearChartEl = document.querySelector("#chart-year");
  293. if (opts.selectedDataPoints[0].length === 1) {
  294. if (quarterChartEl.classList.contains("active")) {
  295. updateQuarterChart(chart, 'barQuarter')
  296. } else {
  297. yearChartEl.classList.add("chart-quarter-activated")
  298. quarterChartEl.classList.add("active");
  299. updateQuarterChart(chart, 'barQuarter')
  300. }
  301. } else {
  302. updateQuarterChart(chart, 'barQuarter')
  303. }
  304. if (opts.selectedDataPoints[0].length === 0) {
  305. yearChartEl.classList.remove("chart-quarter-activated")
  306. quarterChartEl.classList.remove("active");
  307. }
  308. },
  309. updated: function (chart) {
  310. updateQuarterChart(chart, 'barQuarter')
  311. }
  312. }
  313. },
  314. plotOptions: {
  315. bar: {
  316. distributed: true,
  317. horizontal: true,
  318. barHeight: '75%',
  319. dataLabels: {
  320. position: 'bottom'
  321. }
  322. }
  323. },
  324. dataLabels: {
  325. enabled: true,
  326. textAnchor: 'start',
  327. style: {
  328. colors: ['#fff']
  329. },
  330. formatter: function (val, opt) {
  331. return opt.w.globals.labels[opt.dataPointIndex]
  332. },
  333. offsetX: 0,
  334. dropShadow: {
  335. enabled: true
  336. }
  337. },
  338. colors: colors,
  339. states: {
  340. normal: {
  341. filter: {
  342. type: 'desaturate'
  343. }
  344. },
  345. active: {
  346. allowMultipleDataPointsSelection: true,
  347. filter: {
  348. type: 'darken',
  349. value: 1
  350. }
  351. }
  352. },
  353. tooltip: {
  354. x: {
  355. show: false
  356. },
  357. y: {
  358. title: {
  359. formatter: function (val, opts) {
  360. return opts.w.globals.labels[opts.dataPointIndex]
  361. }
  362. }
  363. }
  364. },
  365. title: {
  366. text: 'Yearly Results',
  367. offsetX: 15
  368. },
  369. subtitle: {
  370. text: '(Click on bar to see details)',
  371. offsetX: 15
  372. },
  373. yaxis: {
  374. labels: {
  375. show: false
  376. }
  377. }
  378. };
  379. var chart = new ApexCharts(document.querySelector("#chart-year"), options);
  380. chart.render();
  381. var optionsQuarter = {
  382. series: [{
  383. data: []
  384. }],
  385. chart: {
  386. id: 'barQuarter',
  387. height: 400,
  388. width: '100%',
  389. type: 'bar',
  390. stacked: true
  391. },
  392. plotOptions: {
  393. bar: {
  394. columnWidth: '50%',
  395. horizontal: false
  396. }
  397. },
  398. legend: {
  399. show: false
  400. },
  401. grid: {
  402. yaxis: {
  403. lines: {
  404. show: false,
  405. }
  406. },
  407. xaxis: {
  408. lines: {
  409. show: true,
  410. }
  411. }
  412. },
  413. yaxis: {
  414. labels: {
  415. show: false
  416. }
  417. },
  418. title: {
  419. text: 'Quarterly Results',
  420. offsetX: 10
  421. },
  422. tooltip: {
  423. x: {
  424. formatter: function (val, opts) {
  425. return opts.w.globals.seriesNames[opts.seriesIndex]
  426. }
  427. },
  428. y: {
  429. title: {
  430. formatter: function (val, opts) {
  431. return opts.w.globals.labels[opts.dataPointIndex]
  432. }
  433. }
  434. }
  435. }
  436. };
  437. var chartQuarter = new ApexCharts(document.querySelector("#chart-quarter"), optionsQuarter);
  438. chartQuarter.render();
  439. chart.addEventListener('dataPointSelection', function (e, chart, opts) {
  440. var quarterChartEl = document.querySelector("#chart-quarter");
  441. var yearChartEl = document.querySelector("#chart-year");
  442. if (opts.selectedDataPoints[0].length === 1) {
  443. if(quarterChartEl.classList.contains("active")) {
  444. updateQuarterChart(chart, 'barQuarter')
  445. }
  446. else {
  447. yearChartEl.classList.add("chart-quarter-activated")
  448. quarterChartEl.classList.add("active");
  449. updateQuarterChart(chart, 'barQuarter')
  450. }
  451. } else {
  452. updateQuarterChart(chart, 'barQuarter')
  453. }
  454. if (opts.selectedDataPoints[0].length === 0) {
  455. yearChartEl.classList.remove("chart-quarter-activated")
  456. quarterChartEl.classList.remove("active");
  457. }
  458. })
  459. chart.addEventListener('updated', function (chart) {
  460. updateQuarterChart(chart, 'barQuarter')
  461. })
  462. document.querySelector("#model").addEventListener("change", function (e) {
  463. chart.updateSeries([{
  464. data: makeData()
  465. }])
  466. })
  467. </script>
  468. </body>
  469. </html>