選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

index.min.js 16 KiB

2年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. (function () {
  2. 'use strict';
  3. var HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];
  4. var HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];
  5. // Universal constants
  6. var ANGLE_RATIO = Math.PI / 180;
  7. /**
  8. * Shuffles array in place. ES6 version
  9. * @param {Array} array An array containing the items.
  10. */
  11. function shuffle(array) {
  12. // Awesomeness: https://bost.ocks.org/mike/shuffle/
  13. // https://stackoverflow.com/a/2450976/6495043
  14. // https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1
  15. for (var i = array.length - 1; i > 0; i--) {
  16. var j = Math.floor(Math.random() * (i + 1));
  17. var _ref = [array[j], array[i]];
  18. array[i] = _ref[0];
  19. array[j] = _ref[1];
  20. }
  21. return array;
  22. }
  23. // https://stackoverflow.com/a/29325222
  24. function getRandomBias(min, max, bias, influence) {
  25. var range = max - min;
  26. var biasValue = range * bias + min;
  27. var rnd = Math.random() * range + min,
  28. // random in range
  29. mix = Math.random() * influence; // random mixer
  30. return rnd * (1 - mix) + biasValue * mix; // mix full range and bias
  31. }
  32. // Playing around with dates
  33. var NO_OF_MILLIS = 1000;
  34. var SEC_IN_DAY = 86400;
  35. var MONTH_NAMES_SHORT = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
  36. function clone(date) {
  37. return new Date(date.getTime());
  38. }
  39. function timestampSec(date) {
  40. return date.getTime() / NO_OF_MILLIS;
  41. }
  42. function timestampToMidnight(timestamp) {
  43. var roundAhead = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  44. var midnightTs = Math.floor(timestamp - timestamp % SEC_IN_DAY);
  45. if (roundAhead) {
  46. return midnightTs + SEC_IN_DAY;
  47. }
  48. return midnightTs;
  49. }
  50. // mutates
  51. function addDays(date, numberOfDays) {
  52. date.setDate(date.getDate() + numberOfDays);
  53. }
  54. // Composite Chart
  55. // ================================================================================
  56. var reportCountList = [152, 222, 199, 287, 534, 709, 1179, 1256, 1632, 1856, 1850];
  57. var lineCompositeData = {
  58. labels: ["2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017"],
  59. yMarkers: [{
  60. label: "Average 100 reports/month",
  61. value: 1200,
  62. options: { labelPos: "left" }
  63. }],
  64. datasets: [{
  65. name: "Events",
  66. values: reportCountList
  67. }]
  68. };
  69. var fireball_5_25 = [[4, 0, 3, 1, 1, 2, 1, 1, 1, 0, 1, 1], [2, 3, 3, 2, 1, 3, 0, 1, 2, 7, 10, 4], [5, 6, 2, 4, 0, 1, 4, 3, 0, 2, 0, 1], [0, 2, 6, 2, 1, 1, 2, 3, 6, 3, 7, 8], [6, 8, 7, 7, 4, 5, 6, 5, 22, 12, 10, 11], [7, 10, 11, 7, 3, 2, 7, 7, 11, 15, 22, 20], [13, 16, 21, 18, 19, 17, 12, 17, 31, 28, 25, 29], [24, 14, 21, 14, 11, 15, 19, 21, 41, 22, 32, 18], [31, 20, 30, 22, 14, 17, 21, 35, 27, 50, 117, 24], [32, 24, 21, 27, 11, 27, 43, 37, 44, 40, 48, 32], [31, 38, 36, 26, 23, 23, 25, 29, 26, 47, 61, 50]];
  70. var fireball_2_5 = [[22, 6, 6, 9, 7, 8, 6, 14, 19, 10, 8, 20], [11, 13, 12, 8, 9, 11, 9, 13, 10, 22, 40, 24], [20, 13, 13, 19, 13, 10, 14, 13, 20, 18, 5, 9], [7, 13, 16, 19, 12, 11, 21, 27, 27, 24, 33, 33], [38, 25, 28, 22, 31, 21, 35, 42, 37, 32, 46, 53], [50, 33, 36, 34, 35, 28, 27, 52, 58, 59, 75, 69], [54, 67, 67, 45, 66, 51, 38, 64, 90, 113, 116, 87], [84, 52, 56, 51, 55, 46, 50, 87, 114, 83, 152, 93], [73, 58, 59, 63, 56, 51, 83, 140, 103, 115, 265, 89], [106, 95, 94, 71, 77, 75, 99, 136, 129, 154, 168, 156], [81, 102, 95, 72, 58, 91, 89, 122, 124, 135, 183, 171]];
  71. var fireballOver25 = [
  72. // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  73. [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0], [1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2], [3, 2, 1, 3, 2, 0, 2, 2, 2, 3, 0, 1], [2, 3, 5, 2, 1, 3, 0, 2, 3, 5, 1, 4], [7, 4, 6, 1, 9, 2, 2, 2, 20, 9, 4, 9], [5, 6, 1, 2, 5, 4, 5, 5, 16, 9, 14, 9], [5, 4, 7, 5, 1, 5, 3, 3, 5, 7, 22, 2], [5, 13, 11, 6, 1, 7, 9, 8, 14, 17, 16, 3], [8, 9, 8, 6, 4, 8, 5, 6, 14, 11, 21, 12]];
  74. var barCompositeData = {
  75. labels: MONTH_NAMES_SHORT,
  76. datasets: [{
  77. name: "Over 25 reports",
  78. values: fireballOver25[9]
  79. }, {
  80. name: "5 to 25 reports",
  81. values: fireball_5_25[9]
  82. }, {
  83. name: "2 to 5 reports",
  84. values: fireball_2_5[9]
  85. }]
  86. };
  87. // Demo Chart multitype Chart
  88. // ================================================================================
  89. var typeData = {
  90. labels: ["12am-3am", "3am-6am", "6am-9am", "9am-12pm", "12pm-3pm", "3pm-6pm", "6pm-9pm", "9pm-12am"],
  91. yMarkers: [{
  92. label: "Marker",
  93. value: 43,
  94. options: { labelPos: "left" }
  95. // type: 'dashed'
  96. }],
  97. yRegions: [{
  98. label: "Region",
  99. start: -10,
  100. end: 50,
  101. options: { labelPos: "right" }
  102. }],
  103. datasets: [{
  104. name: "Some Data",
  105. values: [18, 40, 30, 35, 8, 52, 17, -4],
  106. axisPosition: "right",
  107. chartType: "bar"
  108. }, {
  109. name: "Another Set",
  110. values: [30, 50, -10, 15, 18, 32, 27, 14],
  111. axisPosition: "right",
  112. chartType: "bar"
  113. }, {
  114. name: "Yet Another",
  115. values: [15, 20, -3, -15, 58, 12, -17, 37],
  116. chartType: "line"
  117. }]
  118. };
  119. var trendsData = {
  120. labels: [1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016],
  121. datasets: [{
  122. values: [132.9, 150.0, 149.4, 148.0, 94.4, 97.6, 54.1, 49.2, 22.5, 18.4, 39.3, 131.0, 220.1, 218.9, 198.9, 162.4, 91.0, 60.5, 20.6, 14.8, 33.9, 123.0, 211.1, 191.8, 203.3, 133.0, 76.1, 44.9, 25.1, 11.6, 28.9, 88.3, 136.3, 173.9, 170.4, 163.6, 99.3, 65.3, 45.8, 24.7, 12.6, 4.2, 4.8, 24.9, 80.8, 84.5, 94.0, 113.3, 69.8, 39.8]
  123. }]
  124. };
  125. var moonData = {
  126. names: ["Ganymede", "Callisto", "Io", "Europa"],
  127. masses: [14819000, 10759000, 8931900, 4800000],
  128. distances: [1070.412, 1882.709, 421.7, 671.034],
  129. diameters: [5262.4, 4820.6, 3637.4, 3121.6]
  130. };
  131. var demoConfig = {
  132. lineComposite: {
  133. elementID: "#chart-composite-1",
  134. options: {
  135. title: "Fireball/Bolide Events - Yearly (reported)",
  136. data: lineCompositeData,
  137. type: "line",
  138. height: 190,
  139. colors: ["green"],
  140. isNavigable: 1,
  141. valuesOverPoints: 1,
  142. lineOptions: {
  143. dotSize: 8
  144. }
  145. }
  146. },
  147. barComposite: {
  148. elementID: "#chart-composite-2",
  149. options: {
  150. data: barCompositeData,
  151. type: "bar",
  152. height: 210,
  153. colors: ["violet", "light-blue", "#46a9f9"],
  154. valuesOverPoints: 1,
  155. axisOptions: {
  156. xAxisMode: "tick",
  157. shortenYAxisNumbers: true
  158. },
  159. barOptions: {
  160. stacked: 1
  161. }
  162. }
  163. },
  164. demoMain: {
  165. elementID: "",
  166. options: {
  167. title: "My Awesome Chart",
  168. data: "typeData",
  169. type: "axis-mixed",
  170. height: 300,
  171. colors: ["purple", "magenta", "light-blue"],
  172. maxSlices: 10,
  173. tooltipOptions: {
  174. formatTooltipX: function formatTooltipX(d) {
  175. return (d + '').toUpperCase();
  176. },
  177. formatTooltipY: function formatTooltipY(d) {
  178. return d + ' pts';
  179. }
  180. }
  181. }
  182. }
  183. };
  184. // import { lineComposite, barComposite } from './demoConfig';
  185. // ================================================================================
  186. var Chart = xhiveframework.Chart; // eslint-disable-line no-undef
  187. var lc = demoConfig.lineComposite;
  188. var lineCompositeChart = new Chart(lc.elementID, lc.options);
  189. var bc = demoConfig.barComposite;
  190. var barCompositeChart = new Chart(bc.elementID, bc.options);
  191. lineCompositeChart.parent.addEventListener('data-select', function (e) {
  192. var i = e.index;
  193. barCompositeChart.updateDatasets([fireballOver25[i], fireball_5_25[i], fireball_2_5[i]]);
  194. });
  195. // ================================================================================
  196. var customColors = ['purple', 'magenta', 'light-blue'];
  197. var typeChartArgs = {
  198. title: "My Awesome Chart",
  199. data: typeData,
  200. type: 'axis-mixed',
  201. height: 300,
  202. colors: customColors,
  203. // maxLegendPoints: 6,
  204. maxSlices: 10,
  205. tooltipOptions: {
  206. formatTooltipX: function formatTooltipX(d) {
  207. return (d + '').toUpperCase();
  208. },
  209. formatTooltipY: function formatTooltipY(d) {
  210. return d + ' pts';
  211. }
  212. }
  213. };
  214. var aggrChart = new Chart("#chart-aggr", typeChartArgs);
  215. Array.prototype.slice.call(document.querySelectorAll('.aggr-type-buttons button')).map(function (el) {
  216. el.addEventListener('click', function (e) {
  217. var btn = e.target;
  218. var type = btn.getAttribute('data-type');
  219. typeChartArgs.type = type;
  220. if (type !== 'axis-mixed') {
  221. typeChartArgs.colors = undefined;
  222. } else {
  223. typeChartArgs.colors = customColors;
  224. }
  225. if (type !== 'percentage') {
  226. typeChartArgs.height = 300;
  227. } else {
  228. typeChartArgs.height = undefined;
  229. }
  230. var newChart = new Chart("#chart-aggr", typeChartArgs);
  231. if (newChart) {
  232. aggrChart = newChart;
  233. }
  234. Array.prototype.slice.call(btn.parentNode.querySelectorAll('button')).map(function (el) {
  235. el.classList.remove('active');
  236. });
  237. btn.classList.add('active');
  238. });
  239. });
  240. document.querySelector('.export-aggr').addEventListener('click', function () {
  241. aggrChart.export();
  242. });
  243. // Update values chart
  244. // ================================================================================
  245. var updateDataAllLabels = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon"];
  246. var getRandom = function getRandom() {
  247. return Math.floor(getRandomBias(-40, 60, 0.8, 1));
  248. };
  249. var updateDataAllValues = Array.from({ length: 30 }, getRandom);
  250. // We're gonna be shuffling this
  251. var updateDataAllIndices = updateDataAllLabels.map(function (d, i) {
  252. return i;
  253. });
  254. var getUpdateData = function getUpdateData(source_array) {
  255. var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;
  256. var indices = updateDataAllIndices.slice(0, length);
  257. return indices.map(function (index) {
  258. return source_array[index];
  259. });
  260. };
  261. var updateData = {
  262. labels: getUpdateData(updateDataAllLabels),
  263. datasets: [{
  264. "values": getUpdateData(updateDataAllValues)
  265. }],
  266. yMarkers: [{
  267. label: "Altitude",
  268. value: 25,
  269. type: 'dashed'
  270. }],
  271. yRegions: [{
  272. label: "Range",
  273. start: 10,
  274. end: 45
  275. }]
  276. };
  277. var updateChart = new Chart("#chart-update", {
  278. data: updateData,
  279. type: 'line',
  280. height: 300,
  281. colors: ['#ff6c03'],
  282. lineOptions: {
  283. // hideLine: 1,
  284. regionFill: 1
  285. }
  286. });
  287. var chartUpdateButtons = document.querySelector('.chart-update-buttons');
  288. chartUpdateButtons.querySelector('[data-update="random"]').addEventListener("click", function () {
  289. shuffle(updateDataAllIndices);
  290. var value = getRandom();
  291. var start = getRandom();
  292. var end = getRandom();
  293. var data = {
  294. labels: updateDataAllLabels.slice(0, 10),
  295. datasets: [{ values: getUpdateData(updateDataAllValues) }],
  296. yMarkers: [{
  297. label: "Altitude",
  298. value: value,
  299. type: 'dashed'
  300. }],
  301. yRegions: [{
  302. label: "Range",
  303. start: start,
  304. end: end
  305. }]
  306. };
  307. updateChart.update(data);
  308. });
  309. chartUpdateButtons.querySelector('[data-update="add"]').addEventListener("click", function () {
  310. var index = updateChart.state.datasetLength; // last index to add
  311. if (index >= updateDataAllIndices.length) return;
  312. updateChart.addDataPoint(updateDataAllLabels[index], [updateDataAllValues[index]]);
  313. });
  314. chartUpdateButtons.querySelector('[data-update="remove"]').addEventListener("click", function () {
  315. updateChart.removeDataPoint();
  316. });
  317. document.querySelector('.export-update').addEventListener('click', function () {
  318. updateChart.export();
  319. });
  320. // Trends Chart
  321. // ================================================================================
  322. var plotChartArgs = {
  323. title: "Mean Total Sunspot Count - Yearly",
  324. data: trendsData,
  325. type: 'line',
  326. height: 300,
  327. colors: ['#238e38'],
  328. lineOptions: {
  329. hideDots: 1,
  330. heatline: 1
  331. },
  332. axisOptions: {
  333. xAxisMode: 'tick',
  334. yAxisMode: 'span',
  335. xIsSeries: 1
  336. }
  337. };
  338. var trendsChart = new Chart("#chart-trends", plotChartArgs);
  339. Array.prototype.slice.call(document.querySelectorAll('.chart-plot-buttons button')).map(function (el) {
  340. el.addEventListener('click', function (e) {
  341. var btn = e.target;
  342. var type = btn.getAttribute('data-type');
  343. var config = {};
  344. config[type] = 1;
  345. if (['regionFill', 'heatline'].includes(type)) {
  346. config.hideDots = 1;
  347. }
  348. // plotChartArgs.init = false;
  349. plotChartArgs.lineOptions = config;
  350. new Chart("#chart-trends", plotChartArgs);
  351. Array.prototype.slice.call(btn.parentNode.querySelectorAll('button')).map(function (el) {
  352. el.classList.remove('active');
  353. });
  354. btn.classList.add('active');
  355. });
  356. });
  357. document.querySelector('.export-trends').addEventListener('click', function () {
  358. trendsChart.export();
  359. });
  360. // Event chart
  361. // ================================================================================
  362. var eventsData = {
  363. labels: ["Ganymede", "Callisto", "Io", "Europa"],
  364. datasets: [{
  365. "values": moonData.distances,
  366. "formatted": moonData.distances.map(function (d) {
  367. return d * 1000 + " km";
  368. })
  369. }]
  370. };
  371. var eventsChart = new Chart("#chart-events", {
  372. title: "Jupiter's Moons: Semi-major Axis (1000 km)",
  373. data: eventsData,
  374. type: 'bar',
  375. height: 330,
  376. colors: ['grey'],
  377. isNavigable: 1
  378. });
  379. var dataDiv = document.querySelector('.chart-events-data');
  380. eventsChart.parent.addEventListener('data-select', function (e) {
  381. var name = moonData.names[e.index];
  382. dataDiv.querySelector('.moon-name').innerHTML = name;
  383. dataDiv.querySelector('.semi-major-axis').innerHTML = moonData.distances[e.index] * 1000;
  384. dataDiv.querySelector('.mass').innerHTML = moonData.masses[e.index];
  385. dataDiv.querySelector('.diameter').innerHTML = moonData.diameters[e.index];
  386. dataDiv.querySelector('img').src = "./assets/img/" + name.toLowerCase() + ".jpg";
  387. });
  388. // Heatmap
  389. // ================================================================================
  390. var today = new Date();
  391. var start = clone(today);
  392. addDays(start, 4);
  393. var end = clone(start);
  394. start.setFullYear(start.getFullYear() - 2);
  395. end.setFullYear(end.getFullYear() - 1);
  396. var dataPoints = {};
  397. var startTs = timestampSec(start);
  398. var endTs = timestampSec(end);
  399. startTs = timestampToMidnight(startTs);
  400. endTs = timestampToMidnight(endTs, true);
  401. while (startTs < endTs) {
  402. dataPoints[parseInt(startTs)] = Math.floor(getRandomBias(0, 5, 0.2, 1));
  403. startTs += SEC_IN_DAY;
  404. }
  405. var heatmapData = {
  406. dataPoints: dataPoints,
  407. start: start,
  408. end: end
  409. };
  410. var heatmapArgs = {
  411. title: "Monthly Distribution",
  412. data: heatmapData,
  413. type: 'heatmap',
  414. discreteDomains: 1,
  415. countLabel: 'Level',
  416. colors: HEATMAP_COLORS_BLUE,
  417. legendScale: [0, 1, 2, 4, 5]
  418. };
  419. var heatmapChart = new Chart("#chart-heatmap", heatmapArgs);
  420. Array.prototype.slice.call(document.querySelectorAll('.heatmap-mode-buttons button')).map(function (el) {
  421. el.addEventListener('click', function (e) {
  422. var btn = e.target;
  423. var mode = btn.getAttribute('data-mode');
  424. var discreteDomains = 0;
  425. if (mode === 'discrete') {
  426. discreteDomains = 1;
  427. }
  428. var colors = [];
  429. var colors_mode = document.querySelector('.heatmap-color-buttons .active').getAttribute('data-color');
  430. if (colors_mode === 'halloween') {
  431. colors = HEATMAP_COLORS_YELLOW;
  432. } else if (colors_mode === 'blue') {
  433. colors = HEATMAP_COLORS_BLUE;
  434. }
  435. heatmapArgs.discreteDomains = discreteDomains;
  436. heatmapArgs.colors = colors;
  437. new Chart("#chart-heatmap", heatmapArgs);
  438. Array.prototype.slice.call(btn.parentNode.querySelectorAll('button')).map(function (el) {
  439. el.classList.remove('active');
  440. });
  441. btn.classList.add('active');
  442. });
  443. });
  444. Array.prototype.slice.call(document.querySelectorAll('.heatmap-color-buttons button')).map(function (el) {
  445. el.addEventListener('click', function (e) {
  446. var btn = e.target;
  447. var colors_mode = btn.getAttribute('data-color');
  448. var colors = [];
  449. if (colors_mode === 'halloween') {
  450. colors = HEATMAP_COLORS_YELLOW;
  451. } else if (colors_mode === 'blue') {
  452. colors = HEATMAP_COLORS_BLUE;
  453. }
  454. var discreteDomains = 1;
  455. var view_mode = document.querySelector('.heatmap-mode-buttons .active').getAttribute('data-mode');
  456. if (view_mode === 'continuous') {
  457. discreteDomains = 0;
  458. }
  459. heatmapArgs.discreteDomains = discreteDomains;
  460. heatmapArgs.colors = colors;
  461. new Chart("#chart-heatmap", heatmapArgs);
  462. Array.prototype.slice.call(btn.parentNode.querySelectorAll('button')).map(function (el) {
  463. el.classList.remove('active');
  464. });
  465. btn.classList.add('active');
  466. });
  467. });
  468. document.querySelector('.export-heatmap').addEventListener('click', function () {
  469. heatmapChart.export();
  470. });
  471. }());
  472. //# sourceMappingURL=index.min.js.map