chartx 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,146 @@
1
+
2
+ nv.models.distribution = function() {
3
+
4
+ //============================================================
5
+ // Public Variables with Default Settings
6
+ //------------------------------------------------------------
7
+
8
+ var margin = {top: 0, right: 0, bottom: 0, left: 0}
9
+ , width = 400 //technically width or height depending on x or y....
10
+ , size = 8
11
+ , axis = 'x' // 'x' or 'y'... horizontal or vertical
12
+ , getData = function(d) { return d[axis] } // defaults d.x or d.y
13
+ , color = nv.utils.defaultColor()
14
+ , scale = d3.scale.linear()
15
+ , domain
16
+ ;
17
+
18
+ //============================================================
19
+
20
+
21
+ //============================================================
22
+ // Private Variables
23
+ //------------------------------------------------------------
24
+
25
+ var scale0;
26
+
27
+ //============================================================
28
+
29
+
30
+ function chart(selection) {
31
+ selection.each(function(data) {
32
+ var availableLength = width - (axis === 'x' ? margin.left + margin.right : margin.top + margin.bottom),
33
+ naxis = axis == 'x' ? 'y' : 'x',
34
+ container = d3.select(this);
35
+
36
+
37
+ //------------------------------------------------------------
38
+ // Setup Scales
39
+
40
+ scale0 = scale0 || scale;
41
+
42
+ //------------------------------------------------------------
43
+
44
+
45
+ //------------------------------------------------------------
46
+ // Setup containers and skeleton of chart
47
+
48
+ var wrap = container.selectAll('g.nv-distribution').data([data]);
49
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-distribution');
50
+ var gEnter = wrapEnter.append('g');
51
+ var g = wrap.select('g');
52
+
53
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')
54
+
55
+ //------------------------------------------------------------
56
+
57
+
58
+ var distWrap = g.selectAll('g.nv-dist')
59
+ .data(function(d) { return d }, function(d) { return d.key });
60
+
61
+ distWrap.enter().append('g');
62
+ distWrap
63
+ .attr('class', function(d,i) { return 'nv-dist nv-series-' + i })
64
+ .style('stroke', function(d,i) { return color(d, i) });
65
+
66
+ var dist = distWrap.selectAll('line.nv-dist' + axis)
67
+ .data(function(d) { return d.values })
68
+ dist.enter().append('line')
69
+ .attr(axis + '1', function(d,i) { return scale0(getData(d,i)) })
70
+ .attr(axis + '2', function(d,i) { return scale0(getData(d,i)) })
71
+ d3.transition(distWrap.exit().selectAll('line.nv-dist' + axis))
72
+ .attr(axis + '1', function(d,i) { return scale(getData(d,i)) })
73
+ .attr(axis + '2', function(d,i) { return scale(getData(d,i)) })
74
+ .style('stroke-opacity', 0)
75
+ .remove();
76
+ dist
77
+ .attr('class', function(d,i) { return 'nv-dist' + axis + ' nv-dist' + axis + '-' + i })
78
+ .attr(naxis + '1', 0)
79
+ .attr(naxis + '2', size);
80
+ d3.transition(dist)
81
+ .attr(axis + '1', function(d,i) { return scale(getData(d,i)) })
82
+ .attr(axis + '2', function(d,i) { return scale(getData(d,i)) })
83
+
84
+
85
+ scale0 = scale.copy();
86
+
87
+ });
88
+
89
+ return chart;
90
+ }
91
+
92
+
93
+ //============================================================
94
+ // Expose Public Variables
95
+ //------------------------------------------------------------
96
+
97
+ chart.margin = function(_) {
98
+ if (!arguments.length) return margin;
99
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
100
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
101
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
102
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
103
+ return chart;
104
+ };
105
+
106
+ chart.width = function(_) {
107
+ if (!arguments.length) return width;
108
+ width = _;
109
+ return chart;
110
+ };
111
+
112
+ chart.axis = function(_) {
113
+ if (!arguments.length) return axis;
114
+ axis = _;
115
+ return chart;
116
+ };
117
+
118
+ chart.size = function(_) {
119
+ if (!arguments.length) return size;
120
+ size = _;
121
+ return chart;
122
+ };
123
+
124
+ chart.getData = function(_) {
125
+ if (!arguments.length) return getData;
126
+ getData = d3.functor(_);
127
+ return chart;
128
+ };
129
+
130
+ chart.scale = function(_) {
131
+ if (!arguments.length) return scale;
132
+ scale = _;
133
+ return chart;
134
+ };
135
+
136
+ chart.color = function(_) {
137
+ if (!arguments.length) return color;
138
+ color = nv.utils.getColor(_);
139
+ return chart;
140
+ };
141
+
142
+ //============================================================
143
+
144
+
145
+ return chart;
146
+ }
@@ -0,0 +1,289 @@
1
+ //TODO: consider deprecating and using multibar with single series for this
2
+ nv.models.historicalBar = function() {
3
+
4
+ //============================================================
5
+ // Public Variables with Default Settings
6
+ //------------------------------------------------------------
7
+
8
+ var margin = {top: 0, right: 0, bottom: 0, left: 0}
9
+ , width = 960
10
+ , height = 500
11
+ , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one
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
+ , forceX = []
17
+ , forceY = [0]
18
+ , padData = false
19
+ , clipEdge = true
20
+ , color = nv.utils.defaultColor()
21
+ , xDomain
22
+ , yDomain
23
+ , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout')
24
+ ;
25
+
26
+ //============================================================
27
+
28
+
29
+ function chart(selection) {
30
+ selection.each(function(data) {
31
+ var availableWidth = width - margin.left - margin.right,
32
+ availableHeight = height - margin.top - margin.bottom,
33
+ container = d3.select(this);
34
+
35
+
36
+ //------------------------------------------------------------
37
+ // Setup Scales
38
+
39
+ x .domain(xDomain || d3.extent(data[0].values.map(getX).concat(forceX) ))
40
+
41
+ if (padData)
42
+ x.range([availableWidth * .5 / data[0].values.length, availableWidth * (data[0].values.length - .5) / data[0].values.length ]);
43
+ else
44
+ x.range([0, availableWidth]);
45
+
46
+ y .domain(yDomain || d3.extent(data[0].values.map(getY).concat(forceY) ))
47
+ .range([availableHeight, 0]);
48
+
49
+ // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point
50
+ if (x.domain()[0] === x.domain()[1] || y.domain()[0] === y.domain()[1]) singlePoint = true;
51
+ if (x.domain()[0] === x.domain()[1])
52
+ x.domain()[0] ?
53
+ x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])
54
+ : x.domain([-1,1]);
55
+
56
+ if (y.domain()[0] === y.domain()[1])
57
+ y.domain()[0] ?
58
+ y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01])
59
+ : y.domain([-1,1]);
60
+
61
+ //------------------------------------------------------------
62
+
63
+
64
+ //------------------------------------------------------------
65
+ // Setup containers and skeleton of chart
66
+
67
+ var wrap = container.selectAll('g.nv-wrap.nv-bar').data([data[0].values]);
68
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-bar');
69
+ var defsEnter = wrapEnter.append('defs');
70
+ var gEnter = wrapEnter.append('g');
71
+ var g = wrap.select('g');
72
+
73
+ gEnter.append('g').attr('class', 'nv-bars');
74
+
75
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
76
+
77
+ //------------------------------------------------------------
78
+
79
+
80
+ container
81
+ .on('click', function(d,i) {
82
+ dispatch.chartClick({
83
+ data: d,
84
+ index: i,
85
+ pos: d3.event,
86
+ id: id
87
+ });
88
+ });
89
+
90
+
91
+ defsEnter.append('clipPath')
92
+ .attr('id', 'nv-chart-clip-path-' + id)
93
+ .append('rect');
94
+
95
+ wrap.select('#nv-chart-clip-path-' + id + ' rect')
96
+ .attr('width', availableWidth)
97
+ .attr('height', availableHeight);
98
+
99
+ g .attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : '');
100
+
101
+
102
+
103
+ var bars = wrap.select('.nv-bars').selectAll('.nv-bar')
104
+ .data(function(d) { return d });
105
+
106
+ bars.exit().remove();
107
+
108
+
109
+ var barsEnter = bars.enter().append('rect')
110
+ //.attr('class', function(d,i,j) { return (getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive') + ' nv-bar-' + j + '-' + i })
111
+ .attr('x', 0 )
112
+ .attr('y', function(d,i) { return y(Math.max(0, getY(d,i))) })
113
+ .attr('height', function(d,i) { return Math.abs(y(getY(d,i)) - y(0)) })
114
+ .on('mouseover', function(d,i) {
115
+ d3.select(this).classed('hover', true);
116
+ dispatch.elementMouseover({
117
+ point: d,
118
+ series: data[0],
119
+ pos: [x(getX(d,i)), y(getY(d,i))], // TODO: Figure out why the value appears to be shifted
120
+ pointIndex: i,
121
+ seriesIndex: 0,
122
+ e: d3.event
123
+ });
124
+
125
+ })
126
+ .on('mouseout', function(d,i) {
127
+ d3.select(this).classed('hover', false);
128
+ dispatch.elementMouseout({
129
+ point: d,
130
+ series: data[0],
131
+ pointIndex: i,
132
+ seriesIndex: 0,
133
+ e: d3.event
134
+ });
135
+ })
136
+ .on('click', function(d,i) {
137
+ dispatch.elementClick({
138
+ //label: d[label],
139
+ value: getY(d,i),
140
+ data: d,
141
+ index: i,
142
+ pos: [x(getX(d,i)), y(getY(d,i))],
143
+ e: d3.event,
144
+ id: id
145
+ });
146
+ d3.event.stopPropagation();
147
+ })
148
+ .on('dblclick', function(d,i) {
149
+ dispatch.elementDblClick({
150
+ //label: d[label],
151
+ value: getY(d,i),
152
+ data: d,
153
+ index: i,
154
+ pos: [x(getX(d,i)), y(getY(d,i))],
155
+ e: d3.event,
156
+ id: id
157
+ });
158
+ d3.event.stopPropagation();
159
+ });
160
+
161
+ bars
162
+ .attr('fill', function(d,i) { return color(d, i); })
163
+ .attr('class', function(d,i,j) { return (getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive') + ' nv-bar-' + j + '-' + i })
164
+ .attr('transform', function(d,i) { return 'translate(' + (x(getX(d,i)) - availableWidth / data[0].values.length * .45) + ',0)'; }) //TODO: better width calculations that don't assume always uniform data spacing;w
165
+ .attr('width', (availableWidth / data[0].values.length) * .9 )
166
+
167
+
168
+ d3.transition(bars)
169
+ //.attr('y', function(d,i) { return y(Math.max(0, getY(d,i))) })
170
+ .attr('y', function(d,i) {
171
+ return getY(d,i) < 0 ?
172
+ y(0) :
173
+ y(0) - y(getY(d,i)) < 1 ?
174
+ y(0) - 1 :
175
+ y(getY(d,i))
176
+ })
177
+ .attr('height', function(d,i) { return Math.max(Math.abs(y(getY(d,i)) - y(0)),1) });
178
+ //.order(); // not sure if this makes any sense for this model
179
+
180
+ });
181
+
182
+ return chart;
183
+ }
184
+
185
+
186
+ //============================================================
187
+ // Expose Public Variables
188
+ //------------------------------------------------------------
189
+
190
+ chart.dispatch = dispatch;
191
+
192
+ chart.x = function(_) {
193
+ if (!arguments.length) return getX;
194
+ getX = _;
195
+ return chart;
196
+ };
197
+
198
+ chart.y = function(_) {
199
+ if (!arguments.length) return getY;
200
+ getY = _;
201
+ return chart;
202
+ };
203
+
204
+ chart.margin = function(_) {
205
+ if (!arguments.length) return margin;
206
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
207
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
208
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
209
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
210
+ return chart;
211
+ };
212
+
213
+ chart.width = function(_) {
214
+ if (!arguments.length) return width;
215
+ width = _;
216
+ return chart;
217
+ };
218
+
219
+ chart.height = function(_) {
220
+ if (!arguments.length) return height;
221
+ height = _;
222
+ return chart;
223
+ };
224
+
225
+ chart.xScale = function(_) {
226
+ if (!arguments.length) return x;
227
+ x = _;
228
+ return chart;
229
+ };
230
+
231
+ chart.yScale = function(_) {
232
+ if (!arguments.length) return y;
233
+ y = _;
234
+ return chart;
235
+ };
236
+
237
+ chart.xDomain = function(_) {
238
+ if (!arguments.length) return xDomain;
239
+ xDomain = _;
240
+ return chart;
241
+ };
242
+
243
+ chart.yDomain = function(_) {
244
+ if (!arguments.length) return yDomain;
245
+ yDomain = _;
246
+ return chart;
247
+ };
248
+
249
+ chart.forceX = function(_) {
250
+ if (!arguments.length) return forceX;
251
+ forceX = _;
252
+ return chart;
253
+ };
254
+
255
+ chart.forceY = function(_) {
256
+ if (!arguments.length) return forceY;
257
+ forceY = _;
258
+ return chart;
259
+ };
260
+
261
+ chart.padData = function(_) {
262
+ if (!arguments.length) return padData;
263
+ padData = _;
264
+ return chart;
265
+ };
266
+
267
+ chart.clipEdge = function(_) {
268
+ if (!arguments.length) return clipEdge;
269
+ clipEdge = _;
270
+ return chart;
271
+ };
272
+
273
+ chart.color = function(_) {
274
+ if (!arguments.length) return color;
275
+ color = nv.utils.getColor(_);
276
+ return chart;
277
+ };
278
+
279
+ chart.id = function(_) {
280
+ if (!arguments.length) return id;
281
+ id = _;
282
+ return chart;
283
+ };
284
+
285
+ //============================================================
286
+
287
+
288
+ return chart;
289
+ }