sparklines.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /* ------------------------------------------------------------------------------
  2. *
  3. * # D3.js - horizontal bar chart
  4. *
  5. * Demo d3.js horizontal bar chart setup with .csv data source
  6. *
  7. * ---------------------------------------------------------------------------- */
  8. // Setup module
  9. // ------------------------------
  10. var DashboardSparklines = function() {
  11. //
  12. // Setup module components
  13. //
  14. // Sparklines chart
  15. var _chartSparkline = function(element, chartType, qty, height, interpolation, duration, interval, color) {
  16. if (typeof d3 == 'undefined') {
  17. console.warn('Warning - d3.min.js is not loaded.');
  18. return;
  19. }
  20. // Initialize chart only if element exsists in the DOM
  21. if($(element).length > 0) {
  22. // Basic setup
  23. // ------------------------------
  24. // Define main variables
  25. var d3Container = d3.select(element),
  26. margin = {top: 0, right: 0, bottom: 0, left: 0},
  27. width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
  28. height = height - margin.top - margin.bottom;
  29. // Generate random data (for demo only)
  30. var data = [];
  31. for (var i=0; i < qty; i++) {
  32. data.push(Math.floor(Math.random() * qty) + 5)
  33. }
  34. // Construct scales
  35. // ------------------------------
  36. // Horizontal
  37. var x = d3.scale.linear().range([0, width]);
  38. // Vertical
  39. var y = d3.scale.linear().range([height - 5, 5]);
  40. // Set input domains
  41. // ------------------------------
  42. // Horizontal
  43. x.domain([1, qty - 3])
  44. // Vertical
  45. y.domain([0, qty])
  46. // Construct chart layout
  47. // ------------------------------
  48. // Line
  49. var line = d3.svg.line()
  50. .interpolate(interpolation)
  51. .x(function(d, i) { return x(i); })
  52. .y(function(d, i) { return y(d); });
  53. // Area
  54. var area = d3.svg.area()
  55. .interpolate(interpolation)
  56. .x(function(d, i) {
  57. return x(i);
  58. })
  59. .y0(height)
  60. .y1(function(d) {
  61. return y(d);
  62. });
  63. // Create SVG
  64. // ------------------------------
  65. // Container
  66. var container = d3Container.append('svg');
  67. // SVG element
  68. var svg = container
  69. .attr('width', width + margin.left + margin.right)
  70. .attr('height', height + margin.top + margin.bottom)
  71. .append("g")
  72. .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
  73. // Add mask for animation
  74. // ------------------------------
  75. // Add clip path
  76. var clip = svg.append('defs')
  77. .append('clipPath')
  78. .attr('id', function(d, i) { return 'load-clip-' + element.substring(1) })
  79. // Add clip shape
  80. var clips = clip.append('rect')
  81. .attr('class', 'load-clip')
  82. .attr('width', 0)
  83. .attr('height', height);
  84. // Animate mask
  85. clips
  86. .transition()
  87. .duration(1000)
  88. .ease('linear')
  89. .attr('width', width);
  90. //
  91. // Append chart elements
  92. //
  93. // Main path
  94. var path = svg.append('g')
  95. .attr('clip-path', function(d, i) { return 'url(#load-clip-' + element.substring(1) + ')'})
  96. .append('path')
  97. .datum(data)
  98. .attr('transform', 'translate(' + x(0) + ',0)');
  99. // Add path based on chart type
  100. if(chartType == 'area') {
  101. path.attr('d', area).attr('class', 'd3-area').style('fill', color); // area
  102. }
  103. else {
  104. path.attr('d', line).attr('class', 'd3-line d3-line-strong').style('stroke', color); // line
  105. }
  106. // Animate path
  107. path
  108. .style('opacity', 0)
  109. .transition()
  110. .duration(750)
  111. .style('opacity', 1);
  112. // Set update interval. For demo only
  113. // ------------------------------
  114. setInterval(function() {
  115. // push a new data point onto the back
  116. data.push(Math.floor(Math.random() * qty) + 5);
  117. // pop the old data point off the front
  118. data.shift();
  119. update();
  120. }, interval);
  121. // Update random data. For demo only
  122. // ------------------------------
  123. function update() {
  124. // Redraw the path and slide it to the left
  125. path
  126. .attr('transform', null)
  127. .transition()
  128. .duration(duration)
  129. .ease('linear')
  130. .attr('transform', 'translate(' + x(0) + ',0)');
  131. // Update path type
  132. if(chartType == 'area') {
  133. path.attr('d', area).attr('class', 'd3-area').style('fill', color)
  134. }
  135. else {
  136. path.attr('d', line).attr('class', 'd3-line d3-line-strong').style('stroke', color);
  137. }
  138. }
  139. // Resize chart
  140. // ------------------------------
  141. // Call function on window resize
  142. window.addEventListener('resize', resizeSparklines);
  143. // Call function on sidebar width change
  144. var sidebarToggle = document.querySelector('.sidebar-control');
  145. sidebarToggle && sidebarToggle.addEventListener('click', resizeSparklines);
  146. // Resize function
  147. //
  148. // Since D3 doesn't support SVG resize by default,
  149. // we need to manually specify parts of the graph that need to
  150. // be updated on window resize
  151. function resizeSparklines() {
  152. // Layout variables
  153. width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
  154. // Layout
  155. // -------------------------
  156. // Main svg width
  157. container.attr('width', width + margin.left + margin.right);
  158. // Width of appended group
  159. svg.attr('width', width + margin.left + margin.right);
  160. // Horizontal range
  161. x.range([0, width]);
  162. // Chart elements
  163. // -------------------------
  164. // Clip mask
  165. clips.attr('width', width);
  166. // Line
  167. svg.select('.d3-line').attr('d', line);
  168. // Area
  169. svg.select('.d3-area').attr('d', area);
  170. }
  171. }
  172. };
  173. //
  174. // Return objects assigned to module
  175. //
  176. return {
  177. init: function() {
  178. _chartSparkline('#new-visitors', 'line', 30, 35, 'basis', 750, 2000, '#26A69A');
  179. _chartSparkline('#new-sessions', 'line', 30, 35, 'basis', 750, 2000, '#FF7043');
  180. _chartSparkline('#total-online', 'line', 30, 35, 'basis', 750, 2000, '#5C6BC0');
  181. _chartSparkline('#server-load', 'area', 30, 50, 'basis', 750, 2000, 'rgba(255,255,255,0.5)');
  182. }
  183. }
  184. }();
  185. // Initialize module
  186. // ------------------------------
  187. document.addEventListener('DOMContentLoaded', function() {
  188. DashboardSparklines.init();
  189. });