chartx 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/.gitignore +17 -0
  2. data/.gitmodules +3 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +145 -0
  6. data/Rakefile +1 -0
  7. data/chartx.gemspec +40 -0
  8. data/lib/chartx/engine.rb +11 -0
  9. data/lib/chartx/helper.rb +184 -0
  10. data/lib/chartx/version.rb +3 -0
  11. data/lib/chartx.rb +3 -0
  12. data/screenshots/barchart.png +0 -0
  13. data/screenshots/bulletchart.png +0 -0
  14. data/screenshots/horizontalbarchart.png +0 -0
  15. data/screenshots/linechart.png +0 -0
  16. data/screenshots/linewithfocuschart.png +0 -0
  17. data/screenshots/multibarchart2.png +0 -0
  18. data/screenshots/piechart.png +0 -0
  19. data/screenshots/scatterchart.png +0 -0
  20. data/screenshots/stackedareachart.png +0 -0
  21. data/screenshots/stackedareachart3.png +0 -0
  22. data/vendor/assets/javascripts/chartx-core.js +9 -0
  23. data/vendor/assets/javascripts/chartx-models.js +2 -0
  24. data/vendor/assets/javascripts/nvd3/.gitignore +27 -0
  25. data/vendor/assets/javascripts/nvd3/.jshintrc +3 -0
  26. data/vendor/assets/javascripts/nvd3/LICENSE.md +49 -0
  27. data/vendor/assets/javascripts/nvd3/README.md +1 -0
  28. data/vendor/assets/javascripts/nvd3/lib/cie.js +155 -0
  29. data/vendor/assets/javascripts/nvd3/lib/crossfilter.js +1180 -0
  30. data/vendor/assets/javascripts/nvd3/lib/crossfilter.min.js +1 -0
  31. data/vendor/assets/javascripts/nvd3/lib/d3.js +8798 -0
  32. data/vendor/assets/javascripts/nvd3/lib/d3.min.js +5 -0
  33. data/vendor/assets/javascripts/nvd3/lib/fisheye.js +86 -0
  34. data/vendor/assets/javascripts/nvd3/lib/hive.js +80 -0
  35. data/vendor/assets/javascripts/nvd3/lib/horizon.js +192 -0
  36. data/vendor/assets/javascripts/nvd3/lib/sankey.js +292 -0
  37. data/vendor/assets/javascripts/nvd3/nv.d3.js +13048 -0
  38. data/vendor/assets/javascripts/nvd3/nv.d3.min.js +6 -0
  39. data/vendor/assets/javascripts/nvd3/src/core.js +118 -0
  40. data/vendor/assets/javascripts/nvd3/src/intro.js +1 -0
  41. data/vendor/assets/javascripts/nvd3/src/models/axis.js +398 -0
  42. data/vendor/assets/javascripts/nvd3/src/models/boilerplate.js +102 -0
  43. data/vendor/assets/javascripts/nvd3/src/models/bullet.js +377 -0
  44. data/vendor/assets/javascripts/nvd3/src/models/bulletChart.js +341 -0
  45. data/vendor/assets/javascripts/nvd3/src/models/cumulativeLineChart.js +685 -0
  46. data/vendor/assets/javascripts/nvd3/src/models/discreteBar.js +327 -0
  47. data/vendor/assets/javascripts/nvd3/src/models/discreteBarChart.js +290 -0
  48. data/vendor/assets/javascripts/nvd3/src/models/distribution.js +146 -0
  49. data/vendor/assets/javascripts/nvd3/src/models/historicalBar.js +289 -0
  50. data/vendor/assets/javascripts/nvd3/src/models/historicalBarChart.js +421 -0
  51. data/vendor/assets/javascripts/nvd3/src/models/indentedTree.js +317 -0
  52. data/vendor/assets/javascripts/nvd3/src/models/legend.js +207 -0
  53. data/vendor/assets/javascripts/nvd3/src/models/line.js +284 -0
  54. data/vendor/assets/javascripts/nvd3/src/models/lineChart.js +421 -0
  55. data/vendor/assets/javascripts/nvd3/src/models/linePlusBarChart.js +455 -0
  56. data/vendor/assets/javascripts/nvd3/src/models/linePlusBarWithFocusChart.js +665 -0
  57. data/vendor/assets/javascripts/nvd3/src/models/lineWithFisheye.js +197 -0
  58. data/vendor/assets/javascripts/nvd3/src/models/lineWithFisheyeChart.js +319 -0
  59. data/vendor/assets/javascripts/nvd3/src/models/lineWithFocusChart.js +560 -0
  60. data/vendor/assets/javascripts/nvd3/src/models/multiBar.js +442 -0
  61. data/vendor/assets/javascripts/nvd3/src/models/multiBarChart.js +506 -0
  62. data/vendor/assets/javascripts/nvd3/src/models/multiBarHorizontal.js +420 -0
  63. data/vendor/assets/javascripts/nvd3/src/models/multiBarHorizontalChart.js +448 -0
  64. data/vendor/assets/javascripts/nvd3/src/models/multiBarTimeSeries.js +371 -0
  65. data/vendor/assets/javascripts/nvd3/src/models/multiBarTimeSeriesChart.js +403 -0
  66. data/vendor/assets/javascripts/nvd3/src/models/multiChart.js +444 -0
  67. data/vendor/assets/javascripts/nvd3/src/models/ohlcBar.js +365 -0
  68. data/vendor/assets/javascripts/nvd3/src/models/parallelCoordinates.js +238 -0
  69. data/vendor/assets/javascripts/nvd3/src/models/pie.js +386 -0
  70. data/vendor/assets/javascripts/nvd3/src/models/pieChart.js +302 -0
  71. data/vendor/assets/javascripts/nvd3/src/models/scatter.js +660 -0
  72. data/vendor/assets/javascripts/nvd3/src/models/scatterChart.js +614 -0
  73. data/vendor/assets/javascripts/nvd3/src/models/scatterPlusLineChart.js +610 -0
  74. data/vendor/assets/javascripts/nvd3/src/models/sparkline.js +179 -0
  75. data/vendor/assets/javascripts/nvd3/src/models/sparklinePlus.js +293 -0
  76. data/vendor/assets/javascripts/nvd3/src/models/stackedArea.js +336 -0
  77. data/vendor/assets/javascripts/nvd3/src/models/stackedAreaChart.js +490 -0
  78. data/vendor/assets/javascripts/nvd3/src/nv.d3.css +704 -0
  79. data/vendor/assets/javascripts/nvd3/src/outro.js +1 -0
  80. data/vendor/assets/javascripts/nvd3/src/tooltip.js +133 -0
  81. data/vendor/assets/javascripts/nvd3/src/utils.js +118 -0
  82. data/vendor/assets/javascripts/set-env.js.erb +1 -0
  83. data/vendor/assets/stylesheets/chartx.css +3 -0
  84. metadata +189 -0
@@ -0,0 +1,179 @@
1
+
2
+ nv.models.sparkline = function() {
3
+
4
+ //============================================================
5
+ // Public Variables with Default Settings
6
+ //------------------------------------------------------------
7
+
8
+ var margin = {top: 2, right: 0, bottom: 2, left: 0}
9
+ , width = 400
10
+ , height = 32
11
+ , animate = true
12
+ , x = d3.scale.linear()
13
+ , y = d3.scale.linear()
14
+ , getX = function(d) { return d.x }
15
+ , getY = function(d) { return d.y }
16
+ , color = nv.utils.getColor(['#000'])
17
+ , xDomain
18
+ , yDomain
19
+ ;
20
+
21
+ //============================================================
22
+
23
+
24
+ function chart(selection) {
25
+ selection.each(function(data) {
26
+ var availableWidth = width - margin.left - margin.right,
27
+ availableHeight = height - margin.top - margin.bottom,
28
+ container = d3.select(this);
29
+
30
+
31
+ //------------------------------------------------------------
32
+ // Setup Scales
33
+
34
+ x .domain(xDomain || d3.extent(data, getX ))
35
+ .range([0, availableWidth]);
36
+
37
+ y .domain(yDomain || d3.extent(data, getY ))
38
+ .range([availableHeight, 0]);
39
+
40
+ //------------------------------------------------------------
41
+
42
+
43
+ //------------------------------------------------------------
44
+ // Setup containers and skeleton of chart
45
+
46
+ var wrap = container.selectAll('g.nv-wrap.nv-sparkline').data([data]);
47
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sparkline');
48
+ var gEnter = wrapEnter.append('g');
49
+ var g = wrap.select('g');
50
+
51
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')
52
+
53
+ //------------------------------------------------------------
54
+
55
+
56
+ var paths = wrap.selectAll('path')
57
+ .data(function(d) { return [d] });
58
+ paths.enter().append('path');
59
+ paths.exit().remove();
60
+ paths
61
+ .style('stroke', function(d,i) { return d.color || color(d, i) })
62
+ .attr('d', d3.svg.line()
63
+ .x(function(d,i) { return x(getX(d,i)) })
64
+ .y(function(d,i) { return y(getY(d,i)) })
65
+ );
66
+
67
+
68
+ // TODO: Add CURRENT data point (Need Min, Mac, Current / Most recent)
69
+ var points = wrap.selectAll('circle.nv-point')
70
+ .data(function(data) {
71
+ var yValues = data.map(function(d, i) { return getY(d,i); });
72
+ function pointIndex(index) {
73
+ if (index != -1) {
74
+ var result = data[index];
75
+ result.pointIndex = index;
76
+ return result;
77
+ } else {
78
+ return null;
79
+ }
80
+ }
81
+ var maxPoint = pointIndex(yValues.lastIndexOf(y.domain()[1])),
82
+ minPoint = pointIndex(yValues.indexOf(y.domain()[0])),
83
+ currentPoint = pointIndex(yValues.length - 1);
84
+ return [minPoint, maxPoint, currentPoint].filter(function (d) {return d != null;});
85
+ });
86
+ points.enter().append('circle');
87
+ points.exit().remove();
88
+ points
89
+ .attr('cx', function(d,i) { return x(getX(d,d.pointIndex)) })
90
+ .attr('cy', function(d,i) { return y(getY(d,d.pointIndex)) })
91
+ .attr('r', 2)
92
+ .attr('class', function(d,i) {
93
+ return getX(d, d.pointIndex) == x.domain()[1] ? 'nv-point nv-currentValue' :
94
+ getY(d, d.pointIndex) == y.domain()[0] ? 'nv-point nv-minValue' : 'nv-point nv-maxValue'
95
+ });
96
+ });
97
+
98
+ return chart;
99
+ }
100
+
101
+
102
+ //============================================================
103
+ // Expose Public Variables
104
+ //------------------------------------------------------------
105
+
106
+ chart.margin = function(_) {
107
+ if (!arguments.length) return margin;
108
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
109
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
110
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
111
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
112
+ return chart;
113
+ };
114
+
115
+ chart.width = function(_) {
116
+ if (!arguments.length) return width;
117
+ width = _;
118
+ return chart;
119
+ };
120
+
121
+ chart.height = function(_) {
122
+ if (!arguments.length) return height;
123
+ height = _;
124
+ return chart;
125
+ };
126
+
127
+ chart.x = function(_) {
128
+ if (!arguments.length) return getX;
129
+ getX = d3.functor(_);
130
+ return chart;
131
+ };
132
+
133
+ chart.y = function(_) {
134
+ if (!arguments.length) return getY;
135
+ getY = d3.functor(_);
136
+ return chart;
137
+ };
138
+
139
+ chart.xScale = function(_) {
140
+ if (!arguments.length) return x;
141
+ x = _;
142
+ return chart;
143
+ };
144
+
145
+ chart.yScale = function(_) {
146
+ if (!arguments.length) return y;
147
+ y = _;
148
+ return chart;
149
+ };
150
+
151
+ chart.xDomain = function(_) {
152
+ if (!arguments.length) return xDomain;
153
+ xDomain = _;
154
+ return chart;
155
+ };
156
+
157
+ chart.yDomain = function(_) {
158
+ if (!arguments.length) return yDomain;
159
+ yDomain = _;
160
+ return chart;
161
+ };
162
+
163
+ chart.animate = function(_) {
164
+ if (!arguments.length) return animate;
165
+ animate = _;
166
+ return chart;
167
+ };
168
+
169
+ chart.color = function(_) {
170
+ if (!arguments.length) return color;
171
+ color = nv.utils.getColor(_);
172
+ return chart;
173
+ };
174
+
175
+ //============================================================
176
+
177
+
178
+ return chart;
179
+ }
@@ -0,0 +1,293 @@
1
+
2
+ nv.models.sparklinePlus = function() {
3
+
4
+ //============================================================
5
+ // Public Variables with Default Settings
6
+ //------------------------------------------------------------
7
+
8
+ var sparkline = nv.models.sparkline();
9
+
10
+ var margin = {top: 15, right: 100, bottom: 10, left: 50}
11
+ , width = null
12
+ , height = null
13
+ , x
14
+ , y
15
+ , index = []
16
+ , paused = false
17
+ , xTickFormat = d3.format(',r')
18
+ , yTickFormat = d3.format(',.2f')
19
+ , showValue = true
20
+ , alignValue = true
21
+ , rightAlignValue = false
22
+ , noData = "No Data Available."
23
+ ;
24
+
25
+ //============================================================
26
+
27
+
28
+ function chart(selection) {
29
+ selection.each(function(data) {
30
+ var container = d3.select(this);
31
+
32
+ var availableWidth = (width || parseInt(container.style('width')) || 960)
33
+ - margin.left - margin.right,
34
+ availableHeight = (height || parseInt(container.style('height')) || 400)
35
+ - margin.top - margin.bottom;
36
+
37
+
38
+
39
+ chart.update = function() { chart(selection) };
40
+ chart.container = this;
41
+
42
+
43
+ //------------------------------------------------------------
44
+ // Display No Data message if there's nothing to show.
45
+
46
+ if (!data || !data.length) {
47
+ var noDataText = container.selectAll('.nv-noData').data([noData]);
48
+
49
+ noDataText.enter().append('text')
50
+ .attr('class', 'nvd3 nv-noData')
51
+ .attr('dy', '-.7em')
52
+ .style('text-anchor', 'middle');
53
+
54
+ noDataText
55
+ .attr('x', margin.left + availableWidth / 2)
56
+ .attr('y', margin.top + availableHeight / 2)
57
+ .text(function(d) { return d });
58
+
59
+ return chart;
60
+ } else {
61
+ container.selectAll('.nv-noData').remove();
62
+ }
63
+
64
+ var currentValue = sparkline.y()(data[data.length-1], data.length-1);
65
+
66
+ //------------------------------------------------------------
67
+
68
+
69
+
70
+ //------------------------------------------------------------
71
+ // Setup Scales
72
+
73
+ x = sparkline.xScale();
74
+ y = sparkline.yScale();
75
+
76
+ //------------------------------------------------------------
77
+
78
+
79
+ //------------------------------------------------------------
80
+ // Setup containers and skeleton of chart
81
+
82
+ var wrap = container.selectAll('g.nv-wrap.nv-sparklineplus').data([data]);
83
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sparklineplus');
84
+ var gEnter = wrapEnter.append('g');
85
+ var g = wrap.select('g');
86
+
87
+ gEnter.append('g').attr('class', 'nv-sparklineWrap');
88
+ gEnter.append('g').attr('class', 'nv-valueWrap');
89
+ gEnter.append('g').attr('class', 'nv-hoverArea');
90
+
91
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
92
+
93
+ //------------------------------------------------------------
94
+
95
+
96
+ //------------------------------------------------------------
97
+ // Main Chart Component(s)
98
+
99
+ var sparklineWrap = g.select('.nv-sparklineWrap');
100
+
101
+ sparkline
102
+ .width(availableWidth)
103
+ .height(availableHeight);
104
+
105
+ sparklineWrap
106
+ .call(sparkline);
107
+
108
+ //------------------------------------------------------------
109
+
110
+
111
+ var valueWrap = g.select('.nv-valueWrap');
112
+
113
+ var value = valueWrap.selectAll('.nv-currentValue')
114
+ .data([currentValue]);
115
+
116
+ value.enter().append('text').attr('class', 'nv-currentValue')
117
+ .attr('dx', rightAlignValue ? -8 : 8)
118
+ .attr('dy', '.9em')
119
+ .style('text-anchor', rightAlignValue ? 'end' : 'start');
120
+
121
+ value
122
+ .attr('x', availableWidth + (rightAlignValue ? margin.right : 0))
123
+ .attr('y', alignValue ? function(d) { return y(d) } : 0)
124
+ .style('fill', sparkline.color()(data[data.length-1], data.length-1))
125
+ .text(yTickFormat(currentValue));
126
+
127
+
128
+
129
+ gEnter.select('.nv-hoverArea').append('rect')
130
+ .on('mousemove', sparklineHover)
131
+ .on('click', function() { paused = !paused })
132
+ .on('mouseout', function() { index = []; updateValueLine(); });
133
+ //.on('mouseout', function() { index = null; updateValueLine(); });
134
+
135
+ g.select('.nv-hoverArea rect')
136
+ .attr('transform', function(d) { return 'translate(' + -margin.left + ',' + -margin.top + ')' })
137
+ .attr('width', availableWidth + margin.left + margin.right)
138
+ .attr('height', availableHeight + margin.top);
139
+
140
+
141
+
142
+ function updateValueLine() { //index is currently global (within the chart), may or may not keep it that way
143
+ if (paused) return;
144
+
145
+ var hoverValue = g.selectAll('.nv-hoverValue').data(index)
146
+
147
+ var hoverEnter = hoverValue.enter()
148
+ .append('g').attr('class', 'nv-hoverValue')
149
+ .style('stroke-opacity', 0)
150
+ .style('fill-opacity', 0);
151
+
152
+ hoverValue.exit()
153
+ .transition().duration(250)
154
+ .style('stroke-opacity', 0)
155
+ .style('fill-opacity', 0)
156
+ .remove();
157
+
158
+ hoverValue
159
+ .attr('transform', function(d) { return 'translate(' + x(sparkline.x()(data[d],d)) + ',0)' })
160
+ .transition().duration(250)
161
+ .style('stroke-opacity', 1)
162
+ .style('fill-opacity', 1);
163
+
164
+ if (!index.length) return;
165
+
166
+ hoverEnter.append('line')
167
+ .attr('x1', 0)
168
+ .attr('y1', -margin.top)
169
+ .attr('x2', 0)
170
+ .attr('y2', availableHeight);
171
+
172
+
173
+ hoverEnter.append('text').attr('class', 'nv-xValue')
174
+ .attr('x', -6)
175
+ .attr('y', -margin.top)
176
+ .attr('text-anchor', 'end')
177
+ .attr('dy', '.9em')
178
+
179
+
180
+ g.select('.nv-hoverValue .nv-xValue')
181
+ .text(xTickFormat(sparkline.x()(data[index[0]], index[0])));
182
+
183
+ hoverEnter.append('text').attr('class', 'nv-yValue')
184
+ .attr('x', 6)
185
+ .attr('y', -margin.top)
186
+ .attr('text-anchor', 'start')
187
+ .attr('dy', '.9em')
188
+
189
+ g.select('.nv-hoverValue .nv-yValue')
190
+ .text(yTickFormat(sparkline.y()(data[index[0]], index[0])));
191
+
192
+ }
193
+
194
+
195
+ function sparklineHover() {
196
+ if (paused) return;
197
+
198
+ var pos = d3.mouse(this)[0] - margin.left;
199
+
200
+ function getClosestIndex(data, x) {
201
+ var distance = Math.abs(sparkline.x()(data[0], 0) - x);
202
+ var closestIndex = 0;
203
+ for (var i = 0; i < data.length; i++){
204
+ if (Math.abs(sparkline.x()(data[i], i) - x) < distance) {
205
+ distance = Math.abs(sparkline.x()(data[i], i) - x);
206
+ closestIndex = i;
207
+ }
208
+ }
209
+ return closestIndex;
210
+ }
211
+
212
+ index = [getClosestIndex(data, Math.round(x.invert(pos)))];
213
+
214
+ updateValueLine();
215
+ }
216
+
217
+ });
218
+
219
+ return chart;
220
+ }
221
+
222
+
223
+ //============================================================
224
+ // Expose Public Variables
225
+ //------------------------------------------------------------
226
+
227
+ // expose chart's sub-components
228
+ chart.sparkline = sparkline;
229
+
230
+ d3.rebind(chart, sparkline, 'x', 'y', 'xScale', 'yScale', 'color');
231
+
232
+ chart.margin = function(_) {
233
+ if (!arguments.length) return margin;
234
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
235
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
236
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
237
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
238
+ return chart;
239
+ };
240
+
241
+ chart.width = function(_) {
242
+ if (!arguments.length) return width;
243
+ width = _;
244
+ return chart;
245
+ };
246
+
247
+ chart.height = function(_) {
248
+ if (!arguments.length) return height;
249
+ height = _;
250
+ return chart;
251
+ };
252
+
253
+ chart.xTickFormat = function(_) {
254
+ if (!arguments.length) return xTickFormat;
255
+ xTickFormat = _;
256
+ return chart;
257
+ };
258
+
259
+ chart.yTickFormat = function(_) {
260
+ if (!arguments.length) return yTickFormat;
261
+ yTickFormat = _;
262
+ return chart;
263
+ };
264
+
265
+ chart.showValue = function(_) {
266
+ if (!arguments.length) return showValue;
267
+ showValue = _;
268
+ return chart;
269
+ };
270
+
271
+ chart.alignValue = function(_) {
272
+ if (!arguments.length) return alignValue;
273
+ alignValue = _;
274
+ return chart;
275
+ };
276
+
277
+ chart.rightAlignValue = function(_) {
278
+ if (!arguments.length) return rightAlignValue;
279
+ rightAlignValue = _;
280
+ return chart;
281
+ };
282
+
283
+ chart.noData = function(_) {
284
+ if (!arguments.length) return noData;
285
+ noData = _;
286
+ return chart;
287
+ };
288
+
289
+ //============================================================
290
+
291
+
292
+ return chart;
293
+ }