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,448 @@
1
+
2
+ nv.models.multiBarHorizontalChart = function() {
3
+
4
+ //============================================================
5
+ // Public Variables with Default Settings
6
+ //------------------------------------------------------------
7
+
8
+ var multibar = nv.models.multiBarHorizontal()
9
+ , xAxis = nv.models.axis()
10
+ , yAxis = nv.models.axis()
11
+ , legend = nv.models.legend().height(30)
12
+ , controls = nv.models.legend().height(30)
13
+ ;
14
+
15
+ var margin = {top: 30, right: 20, bottom: 50, left: 60}
16
+ , width = null
17
+ , height = null
18
+ , color = nv.utils.defaultColor()
19
+ , showControls = true
20
+ , showLegend = true
21
+ , stacked = false
22
+ , tooltips = true
23
+ , tooltip = function(key, x, y, e, graph) {
24
+ return '<h3>' + key + ' - ' + x + '</h3>' +
25
+ '<p>' + y + '</p>'
26
+ }
27
+ , x //can be accessed via chart.xScale()
28
+ , y //can be accessed via chart.yScale()
29
+ , state = { stacked: stacked }
30
+ , defaultState = null
31
+ , noData = 'No Data Available.'
32
+ , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState')
33
+ , controlWidth = function() { return showControls ? 180 : 0 }
34
+ ;
35
+
36
+ multibar
37
+ .stacked(stacked)
38
+ ;
39
+ xAxis
40
+ .orient('left')
41
+ .tickPadding(5)
42
+ .highlightZero(false)
43
+ .showMaxMin(false)
44
+ .tickFormat(function(d) { return d })
45
+ ;
46
+ yAxis
47
+ .orient('bottom')
48
+ .tickFormat(d3.format(',.1f'))
49
+ ;
50
+
51
+ //============================================================
52
+
53
+
54
+ //============================================================
55
+ // Private Variables
56
+ //------------------------------------------------------------
57
+
58
+ var showTooltip = function(e, offsetElement) {
59
+ var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ),
60
+ top = e.pos[1] + ( offsetElement.offsetTop || 0),
61
+ x = xAxis.tickFormat()(multibar.x()(e.point, e.pointIndex)),
62
+ y = yAxis.tickFormat()(multibar.y()(e.point, e.pointIndex)),
63
+ content = tooltip(e.series.key, x, y, e, chart);
64
+
65
+ nv.tooltip.show([left, top], content, e.value < 0 ? 'e' : 'w', null, offsetElement);
66
+ };
67
+
68
+ //============================================================
69
+
70
+
71
+ function chart(selection) {
72
+ selection.each(function(data) {
73
+ var container = d3.select(this),
74
+ that = this;
75
+
76
+ var availableWidth = (width || parseInt(container.style('width')) || 960)
77
+ - margin.left - margin.right,
78
+ availableHeight = (height || parseInt(container.style('height')) || 400)
79
+ - margin.top - margin.bottom;
80
+
81
+ chart.update = function() { container.transition().call(chart) };
82
+ chart.container = this;
83
+
84
+ //set state.disabled
85
+ state.disabled = data.map(function(d) { return !!d.disabled });
86
+
87
+ if (!defaultState) {
88
+ var key;
89
+ defaultState = {};
90
+ for (key in state) {
91
+ if (state[key] instanceof Array)
92
+ defaultState[key] = state[key].slice(0);
93
+ else
94
+ defaultState[key] = state[key];
95
+ }
96
+ }
97
+
98
+ //------------------------------------------------------------
99
+ // Display No Data message if there's nothing to show.
100
+
101
+ if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {
102
+ var noDataText = container.selectAll('.nv-noData').data([noData]);
103
+
104
+ noDataText.enter().append('text')
105
+ .attr('class', 'nvd3 nv-noData')
106
+ .attr('dy', '-.7em')
107
+ .style('text-anchor', 'middle');
108
+
109
+ noDataText
110
+ .attr('x', margin.left + availableWidth / 2)
111
+ .attr('y', margin.top + availableHeight / 2)
112
+ .text(function(d) { return d });
113
+
114
+ return chart;
115
+ } else {
116
+ container.selectAll('.nv-noData').remove();
117
+ }
118
+
119
+ //------------------------------------------------------------
120
+
121
+
122
+ //------------------------------------------------------------
123
+ // Setup Scales
124
+
125
+ x = multibar.xScale();
126
+ y = multibar.yScale();
127
+
128
+ //------------------------------------------------------------
129
+
130
+
131
+ //------------------------------------------------------------
132
+ // Setup containers and skeleton of chart
133
+
134
+ var wrap = container.selectAll('g.nv-wrap.nv-multiBarHorizontalChart').data([data]);
135
+ var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multiBarHorizontalChart').append('g');
136
+ var g = wrap.select('g');
137
+
138
+ gEnter.append('g').attr('class', 'nv-x nv-axis');
139
+ gEnter.append('g').attr('class', 'nv-y nv-axis');
140
+ gEnter.append('g').attr('class', 'nv-barsWrap');
141
+ gEnter.append('g').attr('class', 'nv-legendWrap');
142
+ gEnter.append('g').attr('class', 'nv-controlsWrap');
143
+
144
+ //------------------------------------------------------------
145
+
146
+
147
+ //------------------------------------------------------------
148
+ // Legend
149
+
150
+ if (showLegend) {
151
+ legend.width(availableWidth - controlWidth());
152
+
153
+ if (multibar.barColor())
154
+ data.forEach(function(series,i) {
155
+ series.color = d3.rgb('#ccc').darker(i * 1.5).toString();
156
+ })
157
+
158
+ g.select('.nv-legendWrap')
159
+ .datum(data)
160
+ .call(legend);
161
+
162
+ if ( margin.top != legend.height()) {
163
+ margin.top = legend.height();
164
+ availableHeight = (height || parseInt(container.style('height')) || 400)
165
+ - margin.top - margin.bottom;
166
+ }
167
+
168
+ g.select('.nv-legendWrap')
169
+ .attr('transform', 'translate(' + controlWidth() + ',' + (-margin.top) +')');
170
+ }
171
+
172
+ //------------------------------------------------------------
173
+
174
+
175
+ //------------------------------------------------------------
176
+ // Controls
177
+
178
+ if (showControls) {
179
+ var controlsData = [
180
+ { key: 'Grouped', disabled: multibar.stacked() },
181
+ { key: 'Stacked', disabled: !multibar.stacked() }
182
+ ];
183
+
184
+ controls.width(controlWidth()).color(['#444', '#444', '#444']);
185
+ g.select('.nv-controlsWrap')
186
+ .datum(controlsData)
187
+ .attr('transform', 'translate(0,' + (-margin.top) +')')
188
+ .call(controls);
189
+ }
190
+
191
+ //------------------------------------------------------------
192
+
193
+
194
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
195
+
196
+
197
+ //------------------------------------------------------------
198
+ // Main Chart Component(s)
199
+
200
+ multibar
201
+ .disabled(data.map(function(series) { return series.disabled }))
202
+ .width(availableWidth)
203
+ .height(availableHeight)
204
+ .color(data.map(function(d,i) {
205
+ return d.color || color(d, i);
206
+ }).filter(function(d,i) { return !data[i].disabled }))
207
+
208
+
209
+ var barsWrap = g.select('.nv-barsWrap')
210
+ .datum(data.filter(function(d) { return !d.disabled }))
211
+
212
+ d3.transition(barsWrap).call(multibar);
213
+
214
+ //------------------------------------------------------------
215
+
216
+
217
+ //------------------------------------------------------------
218
+ // Setup Axes
219
+
220
+ xAxis
221
+ .scale(x)
222
+ .ticks( availableHeight / 24 )
223
+ .tickSize(-availableWidth, 0);
224
+
225
+ d3.transition(g.select('.nv-x.nv-axis'))
226
+ .call(xAxis);
227
+
228
+ var xTicks = g.select('.nv-x.nv-axis').selectAll('g');
229
+
230
+ xTicks
231
+ .selectAll('line, text')
232
+ .style('opacity', 1)
233
+
234
+
235
+ yAxis
236
+ .scale(y)
237
+ .ticks( availableWidth / 100 )
238
+ .tickSize( -availableHeight, 0);
239
+
240
+ g.select('.nv-y.nv-axis')
241
+ .attr('transform', 'translate(0,' + availableHeight + ')');
242
+ d3.transition(g.select('.nv-y.nv-axis'))
243
+ .call(yAxis);
244
+
245
+ //------------------------------------------------------------
246
+
247
+
248
+
249
+ //============================================================
250
+ // Event Handling/Dispatching (in chart's scope)
251
+ //------------------------------------------------------------
252
+
253
+ legend.dispatch.on('legendClick', function(d,i) {
254
+ d.disabled = !d.disabled;
255
+
256
+ if (!data.filter(function(d) { return !d.disabled }).length) {
257
+ data.map(function(d) {
258
+ d.disabled = false;
259
+ wrap.selectAll('.nv-series').classed('disabled', false);
260
+ return d;
261
+ });
262
+ }
263
+
264
+ state.disabled = data.map(function(d) { return !!d.disabled });
265
+ dispatch.stateChange(state);
266
+
267
+ chart.update();
268
+ });
269
+
270
+ legend.dispatch.on('legendDblclick', function(d) {
271
+ //Double clicking should always enable current series, and disabled all others.
272
+ data.forEach(function(d) {
273
+ d.disabled = true;
274
+ });
275
+ d.disabled = false;
276
+
277
+ state.disabled = data.map(function(d) { return !!d.disabled });
278
+ dispatch.stateChange(state);
279
+ chart.update();
280
+ });
281
+
282
+ controls.dispatch.on('legendClick', function(d,i) {
283
+ if (!d.disabled) return;
284
+ controlsData = controlsData.map(function(s) {
285
+ s.disabled = true;
286
+ return s;
287
+ });
288
+ d.disabled = false;
289
+
290
+ switch (d.key) {
291
+ case 'Grouped':
292
+ multibar.stacked(false);
293
+ break;
294
+ case 'Stacked':
295
+ multibar.stacked(true);
296
+ break;
297
+ }
298
+
299
+ state.stacked = multibar.stacked();
300
+ dispatch.stateChange(state);
301
+
302
+ chart.update();
303
+ });
304
+
305
+ dispatch.on('tooltipShow', function(e) {
306
+ if (tooltips) showTooltip(e, that.parentNode);
307
+ });
308
+
309
+ // Update chart from a state object passed to event handler
310
+ dispatch.on('changeState', function(e) {
311
+
312
+ if (typeof e.disabled !== 'undefined') {
313
+ data.forEach(function(series,i) {
314
+ series.disabled = e.disabled[i];
315
+ });
316
+
317
+ state.disabled = e.disabled;
318
+ }
319
+
320
+ if (typeof e.stacked !== 'undefined') {
321
+ multibar.stacked(e.stacked);
322
+ state.stacked = e.stacked;
323
+ }
324
+
325
+ selection.call(chart);
326
+ });
327
+ //============================================================
328
+
329
+
330
+ });
331
+
332
+ return chart;
333
+ }
334
+
335
+
336
+ //============================================================
337
+ // Event Handling/Dispatching (out of chart's scope)
338
+ //------------------------------------------------------------
339
+
340
+ multibar.dispatch.on('elementMouseover.tooltip', function(e) {
341
+ e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top];
342
+ dispatch.tooltipShow(e);
343
+ });
344
+
345
+ multibar.dispatch.on('elementMouseout.tooltip', function(e) {
346
+ dispatch.tooltipHide(e);
347
+ });
348
+ dispatch.on('tooltipHide', function() {
349
+ if (tooltips) nv.tooltip.cleanup();
350
+ });
351
+
352
+ //============================================================
353
+
354
+
355
+ //============================================================
356
+ // Expose Public Variables
357
+ //------------------------------------------------------------
358
+
359
+ // expose chart's sub-components
360
+ chart.dispatch = dispatch;
361
+ chart.multibar = multibar;
362
+ chart.legend = legend;
363
+ chart.xAxis = xAxis;
364
+ chart.yAxis = yAxis;
365
+
366
+ d3.rebind(chart, multibar, 'x', 'y', 'xDomain', 'yDomain', 'forceX', 'forceY', 'clipEdge', 'id', 'delay', 'showValues', 'valueFormat', 'stacked', 'barColor');
367
+
368
+ chart.margin = function(_) {
369
+ if (!arguments.length) return margin;
370
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
371
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
372
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
373
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
374
+ return chart;
375
+ };
376
+
377
+ chart.width = function(_) {
378
+ if (!arguments.length) return width;
379
+ width = _;
380
+ return chart;
381
+ };
382
+
383
+ chart.height = function(_) {
384
+ if (!arguments.length) return height;
385
+ height = _;
386
+ return chart;
387
+ };
388
+
389
+ chart.color = function(_) {
390
+ if (!arguments.length) return color;
391
+ color = nv.utils.getColor(_);
392
+ legend.color(color);
393
+ return chart;
394
+ };
395
+
396
+ chart.showControls = function(_) {
397
+ if (!arguments.length) return showControls;
398
+ showControls = _;
399
+ return chart;
400
+ };
401
+
402
+ chart.showLegend = function(_) {
403
+ if (!arguments.length) return showLegend;
404
+ showLegend = _;
405
+ return chart;
406
+ };
407
+
408
+ chart.tooltip = function(_) {
409
+ if (!arguments.length) return tooltip;
410
+ tooltip = _;
411
+ return chart;
412
+ };
413
+
414
+ chart.tooltips = function(_) {
415
+ if (!arguments.length) return tooltips;
416
+ tooltips = _;
417
+ return chart;
418
+ };
419
+
420
+ chart.tooltipContent = function(_) {
421
+ if (!arguments.length) return tooltip;
422
+ tooltip = _;
423
+ return chart;
424
+ };
425
+
426
+ chart.state = function(_) {
427
+ if (!arguments.length) return state;
428
+ state = _;
429
+ return chart;
430
+ };
431
+
432
+ chart.defaultState = function(_) {
433
+ if (!arguments.length) return defaultState;
434
+ defaultState = _;
435
+ return chart;
436
+ };
437
+
438
+ chart.noData = function(_) {
439
+ if (!arguments.length) return noData;
440
+ noData = _;
441
+ return chart;
442
+ };
443
+
444
+ //============================================================
445
+
446
+
447
+ return chart;
448
+ }