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,284 @@
1
+
2
+ nv.models.line = function() {
3
+
4
+ //============================================================
5
+ // Public Variables with Default Settings
6
+ //------------------------------------------------------------
7
+
8
+ var scatter = nv.models.scatter()
9
+ ;
10
+
11
+ var margin = {top: 0, right: 0, bottom: 0, left: 0}
12
+ , width = 960
13
+ , height = 500
14
+ , color = nv.utils.defaultColor() // a function that returns a color
15
+ , getX = function(d) { return d.x } // accessor to get the x value from a data point
16
+ , getY = function(d) { return d.y } // accessor to get the y value from a data point
17
+ , defined = function(d,i) { return !isNaN(getY(d,i)) && getY(d,i) !== null } // allows a line to be not continuous when it is not defined
18
+ , isArea = function(d) { return d.area } // decides if a line is an area or just a line
19
+ , clipEdge = false // if true, masks lines within x and y scale
20
+ , x //can be accessed via chart.xScale()
21
+ , y //can be accessed via chart.yScale()
22
+ , interpolate = "linear" // controls the line interpolation
23
+ ;
24
+
25
+ scatter
26
+ .size(16) // default size
27
+ .sizeDomain([16,256]) //set to speed up calculation, needs to be unset if there is a custom size accessor
28
+ ;
29
+
30
+ //============================================================
31
+
32
+
33
+ //============================================================
34
+ // Private Variables
35
+ //------------------------------------------------------------
36
+
37
+ var x0, y0 //used to store previous scales
38
+ ;
39
+
40
+ //============================================================
41
+
42
+
43
+ function chart(selection) {
44
+ selection.each(function(data) {
45
+ var availableWidth = width - margin.left - margin.right,
46
+ availableHeight = height - margin.top - margin.bottom,
47
+ container = d3.select(this);
48
+
49
+ //------------------------------------------------------------
50
+ // Setup Scales
51
+
52
+ x = scatter.xScale();
53
+ y = scatter.yScale();
54
+
55
+ x0 = x0 || x;
56
+ y0 = y0 || y;
57
+
58
+ //------------------------------------------------------------
59
+
60
+
61
+ //------------------------------------------------------------
62
+ // Setup containers and skeleton of chart
63
+
64
+ var wrap = container.selectAll('g.nv-wrap.nv-line').data([data]);
65
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-line');
66
+ var defsEnter = wrapEnter.append('defs');
67
+ var gEnter = wrapEnter.append('g');
68
+ var g = wrap.select('g')
69
+
70
+ gEnter.append('g').attr('class', 'nv-groups');
71
+ gEnter.append('g').attr('class', 'nv-scatterWrap');
72
+
73
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
74
+
75
+ //------------------------------------------------------------
76
+
77
+
78
+
79
+
80
+ scatter
81
+ .width(availableWidth)
82
+ .height(availableHeight)
83
+
84
+ var scatterWrap = wrap.select('.nv-scatterWrap');
85
+ //.datum(data); // Data automatically trickles down from the wrap
86
+
87
+ d3.transition(scatterWrap).call(scatter);
88
+
89
+
90
+
91
+ defsEnter.append('clipPath')
92
+ .attr('id', 'nv-edge-clip-' + scatter.id())
93
+ .append('rect');
94
+
95
+ wrap.select('#nv-edge-clip-' + scatter.id() + ' rect')
96
+ .attr('width', availableWidth)
97
+ .attr('height', availableHeight);
98
+
99
+ g .attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + scatter.id() + ')' : '');
100
+ scatterWrap
101
+ .attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + scatter.id() + ')' : '');
102
+
103
+
104
+
105
+
106
+ var groups = wrap.select('.nv-groups').selectAll('.nv-group')
107
+ .data(function(d) { return d }, function(d) { return d.key });
108
+ groups.enter().append('g')
109
+ .style('stroke-opacity', 1e-6)
110
+ .style('fill-opacity', 1e-6);
111
+ d3.transition(groups.exit())
112
+ .style('stroke-opacity', 1e-6)
113
+ .style('fill-opacity', 1e-6)
114
+ .remove();
115
+ groups
116
+ .attr('class', function(d,i) { return 'nv-group nv-series-' + i })
117
+ .classed('hover', function(d) { return d.hover })
118
+ .style('fill', function(d,i){ return color(d, i) })
119
+ .style('stroke', function(d,i){ return color(d, i)});
120
+ d3.transition(groups)
121
+ .style('stroke-opacity', 1)
122
+ .style('fill-opacity', .5);
123
+
124
+
125
+
126
+ var areaPaths = groups.selectAll('path.nv-area')
127
+ .data(function(d) { return isArea(d) ? [d] : [] }); // this is done differently than lines because I need to check if series is an area
128
+ areaPaths.enter().append('path')
129
+ .attr('class', 'nv-area')
130
+ .attr('d', function(d) {
131
+ return d3.svg.area()
132
+ .interpolate(interpolate)
133
+ .defined(defined)
134
+ .x(function(d,i) { return x0(getX(d,i)) })
135
+ .y0(function(d,i) { return y0(getY(d,i)) })
136
+ .y1(function(d,i) { return y0( y.domain()[0] <= 0 ? y.domain()[1] >= 0 ? 0 : y.domain()[1] : y.domain()[0] ) })
137
+ //.y1(function(d,i) { return y0(0) }) //assuming 0 is within y domain.. may need to tweak this
138
+ .apply(this, [d.values])
139
+ });
140
+ d3.transition(groups.exit().selectAll('path.nv-area'))
141
+ .attr('d', function(d) {
142
+ return d3.svg.area()
143
+ .interpolate(interpolate)
144
+ .defined(defined)
145
+ .x(function(d,i) { return x(getX(d,i)) })
146
+ .y0(function(d,i) { return y(getY(d,i)) })
147
+ .y1(function(d,i) { return y( y.domain()[0] <= 0 ? y.domain()[1] >= 0 ? 0 : y.domain()[1] : y.domain()[0] ) })
148
+ //.y1(function(d,i) { return y0(0) }) //assuming 0 is within y domain.. may need to tweak this
149
+ .apply(this, [d.values])
150
+ });
151
+ d3.transition(areaPaths)
152
+ .attr('d', function(d) {
153
+ return d3.svg.area()
154
+ .interpolate(interpolate)
155
+ .defined(defined)
156
+ .x(function(d,i) { return x(getX(d,i)) })
157
+ .y0(function(d,i) { return y(getY(d,i)) })
158
+ .y1(function(d,i) { return y( y.domain()[0] <= 0 ? y.domain()[1] >= 0 ? 0 : y.domain()[1] : y.domain()[0] ) })
159
+ //.y1(function(d,i) { return y0(0) }) //assuming 0 is within y domain.. may need to tweak this
160
+ .apply(this, [d.values])
161
+ });
162
+
163
+
164
+
165
+ var linePaths = groups.selectAll('path.nv-line')
166
+ .data(function(d) { return [d.values] });
167
+ linePaths.enter().append('path')
168
+ .attr('class', 'nv-line')
169
+ .attr('d',
170
+ d3.svg.line()
171
+ .interpolate(interpolate)
172
+ .defined(defined)
173
+ .x(function(d,i) { return x0(getX(d,i)) })
174
+ .y(function(d,i) { return y0(getY(d,i)) })
175
+ );
176
+ d3.transition(groups.exit().selectAll('path.nv-line'))
177
+ .attr('d',
178
+ d3.svg.line()
179
+ .interpolate(interpolate)
180
+ .defined(defined)
181
+ .x(function(d,i) { return x(getX(d,i)) })
182
+ .y(function(d,i) { return y(getY(d,i)) })
183
+ );
184
+ d3.transition(linePaths)
185
+ .attr('d',
186
+ d3.svg.line()
187
+ .interpolate(interpolate)
188
+ .defined(defined)
189
+ .x(function(d,i) { return x(getX(d,i)) })
190
+ .y(function(d,i) { return y(getY(d,i)) })
191
+ );
192
+
193
+
194
+
195
+ //store old scales for use in transitions on update
196
+ x0 = x.copy();
197
+ y0 = y.copy();
198
+
199
+ });
200
+
201
+ return chart;
202
+ }
203
+
204
+
205
+ //============================================================
206
+ // Expose Public Variables
207
+ //------------------------------------------------------------
208
+
209
+ chart.dispatch = scatter.dispatch;
210
+ chart.scatter = scatter;
211
+
212
+ d3.rebind(chart, scatter, 'id', 'interactive', 'size', 'xScale', 'yScale', 'zScale', 'xDomain', 'yDomain', 'sizeDomain', 'forceX', 'forceY', 'forceSize', 'clipVoronoi', 'clipRadius', 'padData');
213
+
214
+ chart.margin = function(_) {
215
+ if (!arguments.length) return margin;
216
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
217
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
218
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
219
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
220
+ return chart;
221
+ };
222
+
223
+ chart.width = function(_) {
224
+ if (!arguments.length) return width;
225
+ width = _;
226
+ return chart;
227
+ };
228
+
229
+ chart.height = function(_) {
230
+ if (!arguments.length) return height;
231
+ height = _;
232
+ return chart;
233
+ };
234
+
235
+ chart.x = function(_) {
236
+ if (!arguments.length) return getX;
237
+ getX = _;
238
+ scatter.x(_);
239
+ return chart;
240
+ };
241
+
242
+ chart.y = function(_) {
243
+ if (!arguments.length) return getY;
244
+ getY = _;
245
+ scatter.y(_);
246
+ return chart;
247
+ };
248
+
249
+ chart.clipEdge = function(_) {
250
+ if (!arguments.length) return clipEdge;
251
+ clipEdge = _;
252
+ return chart;
253
+ };
254
+
255
+ chart.color = function(_) {
256
+ if (!arguments.length) return color;
257
+ color = nv.utils.getColor(_);
258
+ scatter.color(color);
259
+ return chart;
260
+ };
261
+
262
+ chart.interpolate = function(_) {
263
+ if (!arguments.length) return interpolate;
264
+ interpolate = _;
265
+ return chart;
266
+ };
267
+
268
+ chart.defined = function(_) {
269
+ if (!arguments.length) return defined;
270
+ defined = _;
271
+ return chart;
272
+ };
273
+
274
+ chart.isArea = function(_) {
275
+ if (!arguments.length) return isArea;
276
+ isArea = d3.functor(_);
277
+ return chart;
278
+ };
279
+
280
+ //============================================================
281
+
282
+
283
+ return chart;
284
+ }
@@ -0,0 +1,421 @@
1
+
2
+ nv.models.lineChart = function() {
3
+
4
+ //============================================================
5
+ // Public Variables with Default Settings
6
+ //------------------------------------------------------------
7
+
8
+ var lines = nv.models.line()
9
+ , xAxis = nv.models.axis()
10
+ , yAxis = nv.models.axis()
11
+ , legend = nv.models.legend()
12
+ ;
13
+
14
+ //set margin.right to 23 to fit dates on the x-axis within the chart
15
+ var margin = {top: 30, right: 20, bottom: 50, left: 60}
16
+ , color = nv.utils.defaultColor()
17
+ , width = null
18
+ , height = null
19
+ , showLegend = true
20
+ , showXAxis = true
21
+ , showYAxis = true
22
+ , rightAlignYAxis = false
23
+ , tooltips = true
24
+ , tooltip = function(key, x, y, e, graph) {
25
+ return '<h3>' + key + '</h3>' +
26
+ '<p>' + y + ' at ' + x + '</p>'
27
+ }
28
+ , x
29
+ , y
30
+ , state = {}
31
+ , defaultState = null
32
+ , noData = 'No Data Available.'
33
+ , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState')
34
+ ;
35
+
36
+ xAxis
37
+ .orient('bottom')
38
+ .tickPadding(7)
39
+ ;
40
+ yAxis
41
+ .orient((rightAlignYAxis) ? 'right' : 'left')
42
+ ;
43
+
44
+ //============================================================
45
+
46
+
47
+ //============================================================
48
+ // Private Variables
49
+ //------------------------------------------------------------
50
+
51
+ var showTooltip = function(e, offsetElement) {
52
+
53
+ // New addition to calculate position if SVG is scaled with viewBox, may move TODO: consider implementing everywhere else
54
+ if (offsetElement) {
55
+ var svg = d3.select(offsetElement).select('svg');
56
+ var viewBox = (svg.node()) ? svg.attr('viewBox') : null;
57
+ if (viewBox) {
58
+ viewBox = viewBox.split(' ');
59
+ var ratio = parseInt(svg.style('width')) / viewBox[2];
60
+ e.pos[0] = e.pos[0] * ratio;
61
+ e.pos[1] = e.pos[1] * ratio;
62
+ }
63
+ }
64
+
65
+ var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ),
66
+ top = e.pos[1] + ( offsetElement.offsetTop || 0),
67
+ x = xAxis.tickFormat()(lines.x()(e.point, e.pointIndex)),
68
+ y = yAxis.tickFormat()(lines.y()(e.point, e.pointIndex)),
69
+ content = tooltip(e.series.key, x, y, e, chart);
70
+
71
+ nv.tooltip.show([left, top], content, null, null, offsetElement);
72
+ };
73
+
74
+ //============================================================
75
+
76
+
77
+ function chart(selection) {
78
+ selection.each(function(data) {
79
+ var container = d3.select(this),
80
+ that = this;
81
+
82
+ var availableWidth = (width || parseInt(container.style('width')) || 960)
83
+ - margin.left - margin.right,
84
+ availableHeight = (height || parseInt(container.style('height')) || 400)
85
+ - margin.top - margin.bottom;
86
+
87
+
88
+ chart.update = function() { container.transition().call(chart) };
89
+ chart.container = this;
90
+
91
+ //set state.disabled
92
+ state.disabled = data.map(function(d) { return !!d.disabled });
93
+
94
+ if (!defaultState) {
95
+ var key;
96
+ defaultState = {};
97
+ for (key in state) {
98
+ if (state[key] instanceof Array)
99
+ defaultState[key] = state[key].slice(0);
100
+ else
101
+ defaultState[key] = state[key];
102
+ }
103
+ }
104
+
105
+ //------------------------------------------------------------
106
+ // Display noData message if there's nothing to show.
107
+
108
+ if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {
109
+ var noDataText = container.selectAll('.nv-noData').data([noData]);
110
+
111
+ noDataText.enter().append('text')
112
+ .attr('class', 'nvd3 nv-noData')
113
+ .attr('dy', '-.7em')
114
+ .style('text-anchor', 'middle');
115
+
116
+ noDataText
117
+ .attr('x', margin.left + availableWidth / 2)
118
+ .attr('y', margin.top + availableHeight / 2)
119
+ .text(function(d) { return d });
120
+
121
+ return chart;
122
+ } else {
123
+ container.selectAll('.nv-noData').remove();
124
+ }
125
+
126
+ //------------------------------------------------------------
127
+
128
+
129
+ //------------------------------------------------------------
130
+ // Setup Scales
131
+
132
+ x = lines.xScale();
133
+ y = lines.yScale();
134
+
135
+ //------------------------------------------------------------
136
+
137
+
138
+ //------------------------------------------------------------
139
+ // Setup containers and skeleton of chart
140
+
141
+ var wrap = container.selectAll('g.nv-wrap.nv-lineChart').data([data]);
142
+ var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-lineChart').append('g');
143
+ var g = wrap.select('g');
144
+
145
+ gEnter.append('g').attr('class', 'nv-x nv-axis');
146
+ gEnter.append('g').attr('class', 'nv-y nv-axis');
147
+ gEnter.append('g').attr('class', 'nv-linesWrap');
148
+ gEnter.append('g').attr('class', 'nv-legendWrap');
149
+
150
+ //------------------------------------------------------------
151
+
152
+
153
+ //------------------------------------------------------------
154
+ // Legend
155
+
156
+ if (showLegend) {
157
+ legend.width(availableWidth);
158
+
159
+ g.select('.nv-legendWrap')
160
+ .datum(data)
161
+ .call(legend);
162
+
163
+ if ( margin.top != legend.height()) {
164
+ margin.top = legend.height();
165
+ availableHeight = (height || parseInt(container.style('height')) || 400)
166
+ - margin.top - margin.bottom;
167
+ }
168
+
169
+ wrap.select('.nv-legendWrap')
170
+ .attr('transform', 'translate(0,' + (-margin.top) +')')
171
+ }
172
+
173
+ //------------------------------------------------------------
174
+
175
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
176
+
177
+ if (rightAlignYAxis) {
178
+ g.select(".nv-y.nv-axis")
179
+ .attr("transform", "translate(" + availableWidth + ",0)");
180
+ }
181
+
182
+ //------------------------------------------------------------
183
+ // Main Chart Component(s)
184
+
185
+ lines
186
+ .width(availableWidth)
187
+ .height(availableHeight)
188
+ .color(data.map(function(d,i) {
189
+ return d.color || color(d, i);
190
+ }).filter(function(d,i) { return !data[i].disabled }));
191
+
192
+
193
+ var linesWrap = g.select('.nv-linesWrap')
194
+ .datum(data.filter(function(d) { return !d.disabled }))
195
+
196
+ d3.transition(linesWrap).call(lines);
197
+
198
+ //------------------------------------------------------------
199
+
200
+
201
+ //------------------------------------------------------------
202
+ // Setup Axes
203
+
204
+ if (showXAxis) {
205
+ xAxis
206
+ .scale(x)
207
+ .ticks( availableWidth / 100 )
208
+ .tickSize(-availableHeight, 0);
209
+
210
+ g.select('.nv-x.nv-axis')
211
+ .attr('transform', 'translate(0,' + y.range()[0] + ')');
212
+ d3.transition(g.select('.nv-x.nv-axis'))
213
+ .call(xAxis);
214
+ }
215
+
216
+ if (showYAxis) {
217
+ yAxis
218
+ .scale(y)
219
+ .ticks( availableHeight / 36 )
220
+ .tickSize( -availableWidth, 0);
221
+
222
+ d3.transition(g.select('.nv-y.nv-axis'))
223
+ .call(yAxis);
224
+ }
225
+ //------------------------------------------------------------
226
+
227
+
228
+ //============================================================
229
+ // Event Handling/Dispatching (in chart's scope)
230
+ //------------------------------------------------------------
231
+
232
+ legend.dispatch.on('legendClick', function(d,i) {
233
+ d.disabled = !d.disabled;
234
+
235
+ if (!data.filter(function(d) { return !d.disabled }).length) {
236
+ data.map(function(d) {
237
+ d.disabled = false;
238
+ wrap.selectAll('.nv-series').classed('disabled', false);
239
+ return d;
240
+ });
241
+ }
242
+
243
+ state.disabled = data.map(function(d) { return !!d.disabled });
244
+ dispatch.stateChange(state);
245
+
246
+ // container.transition().call(chart);
247
+ chart.update();
248
+ });
249
+
250
+ legend.dispatch.on('legendDblclick', function(d) {
251
+ //Double clicking should always enable current series, and disabled all others.
252
+ data.forEach(function(d) {
253
+ d.disabled = true;
254
+ });
255
+ d.disabled = false;
256
+
257
+ state.disabled = data.map(function(d) { return !!d.disabled });
258
+ dispatch.stateChange(state);
259
+ chart.update();
260
+ });
261
+
262
+
263
+ /*
264
+ legend.dispatch.on('legendMouseover', function(d, i) {
265
+ d.hover = true;
266
+ selection.transition().call(chart)
267
+ });
268
+
269
+ legend.dispatch.on('legendMouseout', function(d, i) {
270
+ d.hover = false;
271
+ selection.transition().call(chart)
272
+ });
273
+ */
274
+
275
+ dispatch.on('tooltipShow', function(e) {
276
+ if (tooltips) showTooltip(e, that.parentNode);
277
+ });
278
+
279
+
280
+ dispatch.on('changeState', function(e) {
281
+
282
+ if (typeof e.disabled !== 'undefined') {
283
+ data.forEach(function(series,i) {
284
+ series.disabled = e.disabled[i];
285
+ });
286
+
287
+ state.disabled = e.disabled;
288
+ }
289
+
290
+ chart.update();
291
+ });
292
+
293
+ //============================================================
294
+
295
+ });
296
+
297
+ return chart;
298
+ }
299
+
300
+
301
+ //============================================================
302
+ // Event Handling/Dispatching (out of chart's scope)
303
+ //------------------------------------------------------------
304
+
305
+ lines.dispatch.on('elementMouseover.tooltip', function(e) {
306
+ e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top];
307
+ dispatch.tooltipShow(e);
308
+ });
309
+
310
+ lines.dispatch.on('elementMouseout.tooltip', function(e) {
311
+ dispatch.tooltipHide(e);
312
+ });
313
+
314
+ dispatch.on('tooltipHide', function() {
315
+ if (tooltips) nv.tooltip.cleanup();
316
+ });
317
+
318
+ //============================================================
319
+
320
+
321
+ //============================================================
322
+ // Expose Public Variables
323
+ //------------------------------------------------------------
324
+
325
+ // expose chart's sub-components
326
+ chart.dispatch = dispatch;
327
+ chart.lines = lines;
328
+ chart.legend = legend;
329
+ chart.xAxis = xAxis;
330
+ chart.yAxis = yAxis;
331
+
332
+ d3.rebind(chart, lines, 'defined', 'isArea', 'x', 'y', 'size', 'xScale', 'yScale', 'xDomain', 'yDomain', 'forceX', 'forceY', 'interactive', 'clipEdge', 'clipVoronoi', 'id', 'interpolate');
333
+
334
+ chart.margin = function(_) {
335
+ if (!arguments.length) return margin;
336
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
337
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
338
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
339
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
340
+ return chart;
341
+ };
342
+
343
+ chart.width = function(_) {
344
+ if (!arguments.length) return width;
345
+ width = _;
346
+ return chart;
347
+ };
348
+
349
+ chart.height = function(_) {
350
+ if (!arguments.length) return height;
351
+ height = _;
352
+ return chart;
353
+ };
354
+
355
+ chart.color = function(_) {
356
+ if (!arguments.length) return color;
357
+ color = nv.utils.getColor(_);
358
+ legend.color(color);
359
+ return chart;
360
+ };
361
+
362
+ chart.showLegend = function(_) {
363
+ if (!arguments.length) return showLegend;
364
+ showLegend = _;
365
+ return chart;
366
+ };
367
+
368
+ chart.showXAxis = function(_) {
369
+ if (!arguments.length) return showXAxis;
370
+ showXAxis = _;
371
+ return chart;
372
+ };
373
+
374
+ chart.showYAxis = function(_) {
375
+ if (!arguments.length) return showYAxis;
376
+ showYAxis = _;
377
+ return chart;
378
+ };
379
+
380
+ chart.rightAlignYAxis = function(_) {
381
+ if(!arguments.length) return rightAlignYAxis;
382
+ rightAlignYAxis = _;
383
+ yAxis.orient( (_) ? 'right' : 'left');
384
+ return chart;
385
+ };
386
+
387
+ chart.tooltips = function(_) {
388
+ if (!arguments.length) return tooltips;
389
+ tooltips = _;
390
+ return chart;
391
+ };
392
+
393
+ chart.tooltipContent = function(_) {
394
+ if (!arguments.length) return tooltip;
395
+ tooltip = _;
396
+ return chart;
397
+ };
398
+
399
+ chart.state = function(_) {
400
+ if (!arguments.length) return state;
401
+ state = _;
402
+ return chart;
403
+ };
404
+
405
+ chart.defaultState = function(_) {
406
+ if (!arguments.length) return defaultState;
407
+ defaultState = _;
408
+ return chart;
409
+ };
410
+
411
+ chart.noData = function(_) {
412
+ if (!arguments.length) return noData;
413
+ noData = _;
414
+ return chart;
415
+ };
416
+
417
+ //============================================================
418
+
419
+
420
+ return chart;
421
+ }