data.html 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <!DOCTYPE html>
  2. <html lang="en-US">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <link rel="stylesheet" type="text/css" href="../style.css">
  8. <link rel="icon" type="image/ico" href="../favicon.ico">
  9. <script src="https://cdn.jsdelivr.net/npm/chart.js@2.7.0/dist/Chart.min.js"></script>
  10. <script src="../../chartjs-plugin-datalabels.js"></script>
  11. <script src="../utils.js"></script>
  12. </head>
  13. <body>
  14. <div id="side">
  15. <div id="header"></div>
  16. <div id="actions">
  17. <button onclick="randomize(this)">Randomize</button>
  18. <button onclick="addData(this)">Add Data</button>
  19. <button onclick="removeData(this)">Remove Data</button>
  20. </div>
  21. </div>
  22. <div id="charts">
  23. <div class="wrapper"><canvas id="chart-0"></canvas></div>
  24. </div>
  25. <script>
  26. var SAMPLE_INFO = {
  27. group: 'Scriptable',
  28. name: 'Data',
  29. desc: 'Value increases are shown in blue with a up ' +
  30. 'arrow, decreases in red with a down arrow.'
  31. };
  32. </script>
  33. <script id="script-init">
  34. var DATA_COUNT = 16;
  35. var labels = [];
  36. Samples.srand(4);
  37. for (var i = 0; i < DATA_COUNT; ++i) {
  38. labels.push('' + i);
  39. }
  40. Chart.helpers.merge(Chart.defaults.global, {
  41. aspectRatio: 4/3,
  42. tooltips: false,
  43. layout: {
  44. padding: {
  45. top: 32,
  46. right: 24,
  47. bottom: 32,
  48. left: 0
  49. }
  50. },
  51. elements: {
  52. line: {
  53. fill: false
  54. }
  55. },
  56. plugins: {
  57. legend: false,
  58. title: false
  59. }
  60. });
  61. </script>
  62. <script id="script-construct">
  63. var chart = new Chart('chart-0', {
  64. type: 'line',
  65. data: {
  66. labels: labels,
  67. datasets: [{
  68. backgroundColor: Samples.color(0),
  69. borderColor: Samples.color(0),
  70. data: Samples.numbers({
  71. count: DATA_COUNT,
  72. min: -100,
  73. max: 100
  74. })
  75. }]
  76. },
  77. options: {
  78. plugins: {
  79. datalabels: {
  80. align: function(context) {
  81. var index = context.dataIndex;
  82. var curr = context.dataset.data[index];
  83. var prev = context.dataset.data[index - 1];
  84. var next = context.dataset.data[index + 1];
  85. return prev < curr && next < curr ? 'end' :
  86. prev > curr && next > curr ? 'start' :
  87. 'center';
  88. },
  89. backgroundColor: 'rgba(255, 255, 255, 0.7)',
  90. borderColor: 'rgba(128, 128, 128, 0.7)',
  91. borderRadius: 4,
  92. borderWidth: 1,
  93. color: function(context) {
  94. var i = context.dataIndex;
  95. var value = context.dataset.data[i];
  96. var prev = context.dataset.data[i - 1];
  97. var diff = prev !== undefined ? value - prev : 0;
  98. return diff < 0 ? Samples.color(0) :
  99. diff > 0 ? Samples.color(1) :
  100. 'gray';
  101. },
  102. font: {
  103. size: 11,
  104. weight: 600
  105. },
  106. offset: 8,
  107. formatter: function(value, context) {
  108. var i = context.dataIndex;
  109. var prev = context.dataset.data[i - 1];
  110. var diff = prev !== undefined ? prev - value : 0;
  111. var glyph = diff < 0 ? '\u25B2' : diff > 0 ? '\u25BC' : '\u25C6';
  112. return glyph + ' ' + Math.round(value);
  113. }
  114. }
  115. }
  116. }
  117. });
  118. </script>
  119. <script id="script-actions">
  120. function randomize() {
  121. chart.data.datasets.forEach(function(dataset, i) {
  122. var color = Samples.color();
  123. dataset.backgroundColor = color;
  124. dataset.borderColor = color;
  125. dataset.data = dataset.data.map(function(value) {
  126. return Samples.rand(-100, 100);
  127. });
  128. });
  129. chart.update();
  130. }
  131. function addData() {
  132. chart.data.labels.push(chart.data.labels.length);
  133. chart.data.datasets.forEach(function(dataset, i) {
  134. dataset.data.push(Samples.rand(-100, 100));
  135. });
  136. chart.update();
  137. }
  138. function removeData() {
  139. chart.data.labels.shift();
  140. chart.data.datasets.forEach(function(dataset, i) {
  141. dataset.data.shift();
  142. });
  143. chart.update();
  144. }
  145. </script>
  146. </body>
  147. </html>