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,398 @@
1
+ nv.models.axis = function() {
2
+
3
+ //============================================================
4
+ // Public Variables with Default Settings
5
+ //------------------------------------------------------------
6
+
7
+ var axis = d3.svg.axis()
8
+ ;
9
+
10
+ var margin = {top: 0, right: 0, bottom: 0, left: 0}
11
+ , width = 75 //only used for tickLabel currently
12
+ , height = 60 //only used for tickLabel currently
13
+ , scale = d3.scale.linear()
14
+ , axisLabelText = null
15
+ , showMaxMin = true //TODO: showMaxMin should be disabled on all ordinal scaled axes
16
+ , highlightZero = true
17
+ , rotateLabels = 0
18
+ , rotateYLabel = true
19
+ , staggerLabels = false
20
+ , isOrdinal = false
21
+ , ticks = null
22
+ ;
23
+
24
+ axis
25
+ .scale(scale)
26
+ .orient('bottom')
27
+ .tickFormat(function(d) { return d })
28
+ ;
29
+
30
+ //============================================================
31
+
32
+
33
+ //============================================================
34
+ // Private Variables
35
+ //------------------------------------------------------------
36
+
37
+ var scale0;
38
+
39
+ //============================================================
40
+
41
+
42
+ function chart(selection) {
43
+ selection.each(function(data) {
44
+ var container = d3.select(this);
45
+
46
+
47
+ //------------------------------------------------------------
48
+ // Setup containers and skeleton of chart
49
+
50
+ var wrap = container.selectAll('g.nv-wrap.nv-axis').data([data]);
51
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-axis');
52
+ var gEnter = wrapEnter.append('g');
53
+ var g = wrap.select('g')
54
+
55
+ //------------------------------------------------------------
56
+
57
+
58
+ if (ticks !== null)
59
+ axis.ticks(ticks);
60
+ else if (axis.orient() == 'top' || axis.orient() == 'bottom')
61
+ axis.ticks(Math.abs(scale.range()[1] - scale.range()[0]) / 100);
62
+
63
+
64
+ //TODO: consider calculating width/height based on whether or not label is added, for reference in charts using this component
65
+
66
+
67
+ d3.transition(g)
68
+ .call(axis);
69
+
70
+ scale0 = scale0 || axis.scale();
71
+
72
+ var fmt = axis.tickFormat();
73
+ if (fmt == null) {
74
+ fmt = scale0.tickFormat();
75
+ }
76
+
77
+ var axisLabel = g.selectAll('text.nv-axislabel')
78
+ .data([axisLabelText || null]);
79
+ axisLabel.exit().remove();
80
+ switch (axis.orient()) {
81
+ case 'top':
82
+ axisLabel.enter().append('text').attr('class', 'nv-axislabel');
83
+ var w = (scale.range().length==2) ? scale.range()[1] : (scale.range()[scale.range().length-1]+(scale.range()[1]-scale.range()[0]));
84
+ axisLabel
85
+ .attr('text-anchor', 'middle')
86
+ .attr('y', 0)
87
+ .attr('x', w/2);
88
+ if (showMaxMin) {
89
+ var axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')
90
+ .data(scale.domain());
91
+ axisMaxMin.enter().append('g').attr('class', 'nv-axisMaxMin').append('text');
92
+ axisMaxMin.exit().remove();
93
+ axisMaxMin
94
+ .attr('transform', function(d,i) {
95
+ return 'translate(' + scale(d) + ',0)'
96
+ })
97
+ .select('text')
98
+ .attr('dy', '0em')
99
+ .attr('y', -axis.tickPadding())
100
+ .attr('text-anchor', 'middle')
101
+ .text(function(d,i) {
102
+ var v = fmt(d);
103
+ return ('' + v).match('NaN') ? '' : v;
104
+ });
105
+ d3.transition(axisMaxMin)
106
+ .attr('transform', function(d,i) {
107
+ return 'translate(' + scale.range()[i] + ',0)'
108
+ });
109
+ }
110
+ break;
111
+ case 'bottom':
112
+ var xLabelMargin = 36;
113
+ var maxTextWidth = 30;
114
+ var xTicks = g.selectAll('g').select("text");
115
+ if (rotateLabels%360) {
116
+ //Calculate the longest xTick width
117
+ xTicks.each(function(d,i){
118
+ var width = this.getBBox().width;
119
+ if(width > maxTextWidth) maxTextWidth = width;
120
+ });
121
+ //Convert to radians before calculating sin. Add 30 to margin for healthy padding.
122
+ var sin = Math.abs(Math.sin(rotateLabels*Math.PI/180));
123
+ var xLabelMargin = (sin ? sin*maxTextWidth : maxTextWidth)+30;
124
+ //Rotate all xTicks
125
+ xTicks
126
+ .attr('transform', function(d,i,j) { return 'rotate(' + rotateLabels + ' 0,0)' })
127
+ .attr('text-anchor', rotateLabels%360 > 0 ? 'start' : 'end');
128
+ }
129
+ axisLabel.enter().append('text').attr('class', 'nv-axislabel');
130
+ var w = (scale.range().length==2) ? scale.range()[1] : (scale.range()[scale.range().length-1]+(scale.range()[1]-scale.range()[0]));
131
+ axisLabel
132
+ .attr('text-anchor', 'middle')
133
+ .attr('y', xLabelMargin)
134
+ .attr('x', w/2);
135
+ if (showMaxMin) {
136
+ //if (showMaxMin && !isOrdinal) {
137
+ var axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')
138
+ //.data(scale.domain())
139
+ .data([scale.domain()[0], scale.domain()[scale.domain().length - 1]]);
140
+ axisMaxMin.enter().append('g').attr('class', 'nv-axisMaxMin').append('text');
141
+ axisMaxMin.exit().remove();
142
+ axisMaxMin
143
+ .attr('transform', function(d,i) {
144
+ return 'translate(' + (scale(d) + (isOrdinal ? scale.rangeBand() / 2 : 0)) + ',0)'
145
+ })
146
+ .select('text')
147
+ .attr('dy', '.71em')
148
+ .attr('y', axis.tickPadding())
149
+ .attr('transform', function(d,i,j) { return 'rotate(' + rotateLabels + ' 0,0)' })
150
+ .attr('text-anchor', rotateLabels ? (rotateLabels%360 > 0 ? 'start' : 'end') : 'middle')
151
+ .text(function(d,i) {
152
+ var v = fmt(d);
153
+ return ('' + v).match('NaN') ? '' : v;
154
+ });
155
+ d3.transition(axisMaxMin)
156
+ .attr('transform', function(d,i) {
157
+ //return 'translate(' + scale.range()[i] + ',0)'
158
+ //return 'translate(' + scale(d) + ',0)'
159
+ return 'translate(' + (scale(d) + (isOrdinal ? scale.rangeBand() / 2 : 0)) + ',0)'
160
+ });
161
+ }
162
+ if (staggerLabels)
163
+ xTicks
164
+ .attr('transform', function(d,i) { return 'translate(0,' + (i % 2 == 0 ? '0' : '12') + ')' });
165
+
166
+ break;
167
+ case 'right':
168
+ axisLabel.enter().append('text').attr('class', 'nv-axislabel');
169
+ axisLabel
170
+ .attr('text-anchor', rotateYLabel ? 'middle' : 'begin')
171
+ .attr('transform', rotateYLabel ? 'rotate(90)' : '')
172
+ .attr('y', rotateYLabel ? (-Math.max(margin.right,width) + 12) : -10) //TODO: consider calculating this based on largest tick width... OR at least expose this on chart
173
+ .attr('x', rotateYLabel ? (scale.range()[0] / 2) : axis.tickPadding());
174
+ if (showMaxMin) {
175
+ var axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')
176
+ .data(scale.domain());
177
+ axisMaxMin.enter().append('g').attr('class', 'nv-axisMaxMin').append('text')
178
+ .style('opacity', 0);
179
+ axisMaxMin.exit().remove();
180
+ axisMaxMin
181
+ .attr('transform', function(d,i) {
182
+ return 'translate(0,' + scale(d) + ')'
183
+ })
184
+ .select('text')
185
+ .attr('dy', '.32em')
186
+ .attr('y', 0)
187
+ .attr('x', axis.tickPadding())
188
+ .attr('text-anchor', 'start')
189
+ .text(function(d,i) {
190
+ var v = fmt(d);
191
+ return ('' + v).match('NaN') ? '' : v;
192
+ });
193
+ d3.transition(axisMaxMin)
194
+ .attr('transform', function(d,i) {
195
+ return 'translate(0,' + scale.range()[i] + ')'
196
+ })
197
+ .select('text')
198
+ .style('opacity', 1);
199
+ }
200
+ break;
201
+ case 'left':
202
+ /*
203
+ //For dynamically placing the label. Can be used with dynamically-sized chart axis margins
204
+ var yTicks = g.selectAll('g').select("text");
205
+ yTicks.each(function(d,i){
206
+ var labelPadding = this.getBBox().width + axis.tickPadding() + 16;
207
+ if(labelPadding > width) width = labelPadding;
208
+ });
209
+ */
210
+ axisLabel.enter().append('text').attr('class', 'nv-axislabel');
211
+ axisLabel
212
+ .attr('text-anchor', rotateYLabel ? 'middle' : 'end')
213
+ .attr('transform', rotateYLabel ? 'rotate(-90)' : '')
214
+ .attr('y', rotateYLabel ? (-Math.max(margin.left,width) + 12) : -10) //TODO: consider calculating this based on largest tick width... OR at least expose this on chart
215
+ .attr('x', rotateYLabel ? (-scale.range()[0] / 2) : -axis.tickPadding());
216
+ if (showMaxMin) {
217
+ var axisMaxMin = wrap.selectAll('g.nv-axisMaxMin')
218
+ .data(scale.domain());
219
+ axisMaxMin.enter().append('g').attr('class', 'nv-axisMaxMin').append('text')
220
+ .style('opacity', 0);
221
+ axisMaxMin.exit().remove();
222
+ axisMaxMin
223
+ .attr('transform', function(d,i) {
224
+ return 'translate(0,' + scale0(d) + ')'
225
+ })
226
+ .select('text')
227
+ .attr('dy', '.32em')
228
+ .attr('y', 0)
229
+ .attr('x', -axis.tickPadding())
230
+ .attr('text-anchor', 'end')
231
+ .text(function(d,i) {
232
+ var v = fmt(d);
233
+ return ('' + v).match('NaN') ? '' : v;
234
+ });
235
+ d3.transition(axisMaxMin)
236
+ .attr('transform', function(d,i) {
237
+ return 'translate(0,' + scale.range()[i] + ')'
238
+ })
239
+ .select('text')
240
+ .style('opacity', 1);
241
+ }
242
+ break;
243
+ }
244
+ axisLabel
245
+ .text(function(d) { return d });
246
+
247
+
248
+ if (showMaxMin && (axis.orient() === 'left' || axis.orient() === 'right')) {
249
+ //check if max and min overlap other values, if so, hide the values that overlap
250
+ g.selectAll('g') // the g's wrapping each tick
251
+ .each(function(d,i) {
252
+ d3.select(this).select('text').attr('opacity', 1);
253
+ if (scale(d) < scale.range()[1] + 10 || scale(d) > scale.range()[0] - 10) { // 10 is assuming text height is 16... if d is 0, leave it!
254
+ if (d > 1e-10 || d < -1e-10) // accounts for minor floating point errors... though could be problematic if the scale is EXTREMELY SMALL
255
+ d3.select(this).attr('opacity', 0);
256
+
257
+ d3.select(this).select('text').attr('opacity', 0); // Don't remove the ZERO line!!
258
+ }
259
+ });
260
+
261
+ //if Max and Min = 0 only show min, Issue #281
262
+ if (scale.domain()[0] == scale.domain()[1] && scale.domain()[0] == 0)
263
+ wrap.selectAll('g.nv-axisMaxMin')
264
+ .style('opacity', function(d,i) { return !i ? 1 : 0 });
265
+
266
+ }
267
+
268
+ if (showMaxMin && (axis.orient() === 'top' || axis.orient() === 'bottom')) {
269
+ var maxMinRange = [];
270
+ wrap.selectAll('g.nv-axisMaxMin')
271
+ .each(function(d,i) {
272
+ try {
273
+ if (i) // i== 1, max position
274
+ maxMinRange.push(scale(d) - this.getBBox().width - 4) //assuming the max and min labels are as wide as the next tick (with an extra 4 pixels just in case)
275
+ else // i==0, min position
276
+ maxMinRange.push(scale(d) + this.getBBox().width + 4)
277
+ }catch (err) {
278
+ if (i) // i== 1, max position
279
+ maxMinRange.push(scale(d) - 4) //assuming the max and min labels are as wide as the next tick (with an extra 4 pixels just in case)
280
+ else // i==0, min position
281
+ maxMinRange.push(scale(d) + 4)
282
+ }
283
+ });
284
+ g.selectAll('g') // the g's wrapping each tick
285
+ .each(function(d,i) {
286
+ if (scale(d) < maxMinRange[0] || scale(d) > maxMinRange[1]) {
287
+ if (d > 1e-10 || d < -1e-10) // accounts for minor floating point errors... though could be problematic if the scale is EXTREMELY SMALL
288
+ d3.select(this).remove();
289
+ else
290
+ d3.select(this).select('text').remove(); // Don't remove the ZERO line!!
291
+ }
292
+ });
293
+ }
294
+
295
+
296
+ //highlight zero line ... Maybe should not be an option and should just be in CSS?
297
+ if (highlightZero)
298
+ g.selectAll('.tick')
299
+ .filter(function(d) { return !parseFloat(Math.round(d.__data__*100000)/1000000) && (d.__data__ !== undefined) }) //this is because sometimes the 0 tick is a very small fraction, TODO: think of cleaner technique
300
+ .classed('zero', true);
301
+
302
+ //store old scales for use in transitions on update
303
+ scale0 = scale.copy();
304
+
305
+ });
306
+
307
+ return chart;
308
+ }
309
+
310
+
311
+ //============================================================
312
+ // Expose Public Variables
313
+ //------------------------------------------------------------
314
+
315
+ // expose chart's sub-components
316
+ chart.axis = axis;
317
+
318
+ d3.rebind(chart, axis, 'orient', 'tickValues', 'tickSubdivide', 'tickSize', 'tickPadding', 'tickFormat');
319
+ d3.rebind(chart, scale, 'domain', 'range', 'rangeBand', 'rangeBands'); //these are also accessible by chart.scale(), but added common ones directly for ease of use
320
+
321
+ chart.margin = function(_) {
322
+ if(!arguments.length) return margin;
323
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
324
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
325
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
326
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
327
+ return chart;
328
+ }
329
+
330
+ chart.width = function(_) {
331
+ if (!arguments.length) return width;
332
+ width = _;
333
+ return chart;
334
+ };
335
+
336
+ chart.ticks = function(_) {
337
+ if (!arguments.length) return ticks;
338
+ ticks = _;
339
+ return chart;
340
+ };
341
+
342
+ chart.height = function(_) {
343
+ if (!arguments.length) return height;
344
+ height = _;
345
+ return chart;
346
+ };
347
+
348
+ chart.axisLabel = function(_) {
349
+ if (!arguments.length) return axisLabelText;
350
+ axisLabelText = _;
351
+ return chart;
352
+ }
353
+
354
+ chart.showMaxMin = function(_) {
355
+ if (!arguments.length) return showMaxMin;
356
+ showMaxMin = _;
357
+ return chart;
358
+ }
359
+
360
+ chart.highlightZero = function(_) {
361
+ if (!arguments.length) return highlightZero;
362
+ highlightZero = _;
363
+ return chart;
364
+ }
365
+
366
+ chart.scale = function(_) {
367
+ if (!arguments.length) return scale;
368
+ scale = _;
369
+ axis.scale(scale);
370
+ isOrdinal = typeof scale.rangeBands === 'function';
371
+ d3.rebind(chart, scale, 'domain', 'range', 'rangeBand', 'rangeBands');
372
+ return chart;
373
+ }
374
+
375
+ chart.rotateYLabel = function(_) {
376
+ if(!arguments.length) return rotateYLabel;
377
+ rotateYLabel = _;
378
+ return chart;
379
+ }
380
+
381
+ chart.rotateLabels = function(_) {
382
+ if(!arguments.length) return rotateLabels;
383
+ rotateLabels = _;
384
+ return chart;
385
+ }
386
+
387
+ chart.staggerLabels = function(_) {
388
+ if (!arguments.length) return staggerLabels;
389
+ staggerLabels = _;
390
+ return chart;
391
+ };
392
+
393
+
394
+ //============================================================
395
+
396
+
397
+ return chart;
398
+ }
@@ -0,0 +1,102 @@
1
+
2
+ nv.models.chartName = function() {
3
+
4
+ //============================================================
5
+ // Public Variables with Default Settings
6
+ //------------------------------------------------------------
7
+
8
+
9
+ var margin = {top: 30, right: 10, bottom: 10, left: 10}
10
+ , width = 960
11
+ , height = 500
12
+ , color = nv.utils.getColor(d3.scale.category20c().range())
13
+ , dispatch = d3.dispatch('stateChange', 'changeState')
14
+ ;
15
+
16
+ //============================================================
17
+
18
+
19
+ //============================================================
20
+ // Private Variables
21
+ //------------------------------------------------------------
22
+
23
+
24
+ //============================================================
25
+
26
+
27
+ function chart(selection) {
28
+ selection.each(function(data) {
29
+ var availableWidth = width - margin.left - margin.right,
30
+ availableHeight = height - margin.top - margin.bottom,
31
+ container = d3.select(this);
32
+
33
+
34
+ //------------------------------------------------------------
35
+ // Setup Scales
36
+
37
+
38
+ //------------------------------------------------------------
39
+
40
+
41
+ //------------------------------------------------------------
42
+ // Setup containers and skeleton of chart
43
+
44
+ var wrap = container.selectAll('g.nv-wrap.nv-chartName').data([data]);
45
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-chartName');
46
+ var gEnter = wrapEnter.append('g');
47
+ var g = wrap.select('g')
48
+
49
+ gEnter.append('g').attr('class', 'nv-mainWrap');
50
+
51
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
52
+
53
+ //------------------------------------------------------------
54
+
55
+
56
+
57
+
58
+ });
59
+
60
+ return chart;
61
+ }
62
+
63
+
64
+ //============================================================
65
+ // Expose Public Variables
66
+ //------------------------------------------------------------
67
+
68
+
69
+ chart.dispatch = dispatch;
70
+
71
+ chart.margin = function(_) {
72
+ if (!arguments.length) return margin;
73
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
74
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
75
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
76
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
77
+ return chart;
78
+ };
79
+
80
+ chart.width = function(_) {
81
+ if (!arguments.length) return width;
82
+ width = _;
83
+ return chart;
84
+ };
85
+
86
+ chart.height = function(_) {
87
+ if (!arguments.length) return height;
88
+ height = _;
89
+ return chart;
90
+ };
91
+
92
+ chart.color = function(_) {
93
+ if (!arguments.length) return color;
94
+ color = nv.utils.getColor(_)
95
+ return chart;
96
+ };
97
+
98
+ //============================================================
99
+
100
+
101
+ return chart;
102
+ }