LiveAnimated.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. Ext.require('Ext.chart.*');
  2. Ext.onReady(function () {
  3. var chart;
  4. var generateData = (function() {
  5. var data = [], i = 0,
  6. last = false,
  7. date = new Date(2011, 1, 1),
  8. seconds = +date,
  9. min = Math.min,
  10. max = Math.max,
  11. random = Math.random;
  12. return function() {
  13. data = data.slice();
  14. data.push({
  15. date: Ext.Date.add(date, Ext.Date.DAY, i++),
  16. visits: min(100, max(last? last.visits + (random() - 0.5) * 20 : random() * 100, 0)),
  17. views: min(100, max(last? last.views + (random() - 0.5) * 10 : random() * 100, 0)),
  18. users: min(100, max(last? last.users + (random() - 0.5) * 20 : random() * 100, 0))
  19. });
  20. last = data[data.length -1];
  21. return data;
  22. };
  23. })();
  24. var group = false,
  25. groupOp = [{
  26. dateFormat: 'M d',
  27. groupBy: 'year,month,day'
  28. }, {
  29. dateFormat: 'M',
  30. groupBy: 'year,month'
  31. }];
  32. function regroup() {
  33. group = !group;
  34. var axis = chart.axes.get(1),
  35. selectedGroup = groupOp[+group];
  36. axis.dateFormat = selectedGroup.dateFormat;
  37. axis.groupBy = selectedGroup.groupBy;
  38. chart.redraw();
  39. }
  40. var store = Ext.create('Ext.data.JsonStore', {
  41. fields: ['date', 'visits', 'views', 'users'],
  42. data: generateData()
  43. });
  44. var intr = setInterval(function() {
  45. var gs = generateData();
  46. var toDate = timeAxis.toDate,
  47. lastDate = gs[gs.length - 1].date,
  48. markerIndex = chart.markerIndex || 0;
  49. if (+toDate < +lastDate) {
  50. markerIndex = 1;
  51. timeAxis.toDate = lastDate;
  52. timeAxis.fromDate = Ext.Date.add(Ext.Date.clone(timeAxis.fromDate), Ext.Date.DAY, 1);
  53. chart.markerIndex = markerIndex;
  54. }
  55. store.loadData(gs);
  56. }, 1000);
  57. Ext.create('Ext.Window', {
  58. width: 800,
  59. height: 600,
  60. minHeight: 400,
  61. minWidth: 550,
  62. hidden: false,
  63. maximizable: true,
  64. title: 'Live Animated Chart',
  65. renderTo: Ext.getBody(),
  66. layout: 'fit',
  67. items: [{
  68. xtype: 'chart',
  69. style: 'background:#fff',
  70. id: 'chartCmp',
  71. store: store,
  72. shadow: false,
  73. animate: true,
  74. axes: [{
  75. type: 'Numeric',
  76. grid: true,
  77. minimum: 0,
  78. maximum: 100,
  79. position: 'left',
  80. fields: ['views', 'visits', 'users'],
  81. title: 'Number of Hits',
  82. grid: {
  83. odd: {
  84. fill: '#dedede',
  85. stroke: '#ddd',
  86. 'stroke-width': 0.5
  87. }
  88. }
  89. }, {
  90. type: 'Time',
  91. position: 'bottom',
  92. fields: 'date',
  93. title: 'Day',
  94. dateFormat: 'M d',
  95. groupBy: 'year,month,day',
  96. aggregateOp: 'sum',
  97. constrain: true,
  98. fromDate: new Date(2011, 1, 1),
  99. toDate: new Date(2011, 1, 7),
  100. grid: true
  101. }],
  102. series: [{
  103. type: 'line',
  104. smooth: false,
  105. axis: ['left', 'bottom'],
  106. xField: 'date',
  107. yField: 'visits',
  108. label: {
  109. display: 'none',
  110. field: 'visits',
  111. renderer: function(v) { return v >> 0; },
  112. 'text-anchor': 'middle'
  113. },
  114. markerConfig: {
  115. radius: 5,
  116. size: 5
  117. }
  118. },{
  119. type: 'line',
  120. axis: ['left', 'bottom'],
  121. smooth: false,
  122. xField: 'date',
  123. yField: 'views',
  124. label: {
  125. display: 'none',
  126. field: 'visits',
  127. renderer: function(v) { return v >> 0; },
  128. 'text-anchor': 'middle'
  129. },
  130. markerConfig: {
  131. radius: 5,
  132. size: 5
  133. }
  134. },{
  135. type: 'line',
  136. axis: ['left', 'bottom'],
  137. smooth: false,
  138. xField: 'date',
  139. yField: 'users',
  140. label: {
  141. display: 'none',
  142. field: 'visits',
  143. renderer: function(v) { return v >> 0; },
  144. 'text-anchor': 'middle'
  145. },
  146. markerConfig: {
  147. radius: 5,
  148. size: 5
  149. }
  150. }]
  151. }]
  152. });
  153. chart = Ext.getCmp('chartCmp');
  154. var timeAxis = chart.axes.get(1);
  155. });