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,365 @@
1
+
2
+ nv.models.ohlcBar = 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
+ , getOpen = function(d) { return d.open }
17
+ , getClose = function(d) { return d.close }
18
+ , getHigh = function(d) { return d.high }
19
+ , getLow = function(d) { return d.low }
20
+ , forceX = []
21
+ , forceY = []
22
+ , padData = false // If true, adds half a data points width to front and back, for lining up a line chart with a bar chart
23
+ , clipEdge = true
24
+ , color = nv.utils.defaultColor()
25
+ , xDomain
26
+ , yDomain
27
+ , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout')
28
+ ;
29
+
30
+ //============================================================
31
+
32
+ //============================================================
33
+ // Private Variables
34
+ //------------------------------------------------------------
35
+
36
+ //TODO: store old scales for transitions
37
+
38
+ //============================================================
39
+
40
+
41
+ function chart(selection) {
42
+ selection.each(function(data) {
43
+ var availableWidth = width - margin.left - margin.right,
44
+ availableHeight = height - margin.top - margin.bottom,
45
+ container = d3.select(this);
46
+
47
+
48
+ //------------------------------------------------------------
49
+ // Setup Scales
50
+
51
+ x .domain(xDomain || d3.extent(data[0].values.map(getX).concat(forceX) ));
52
+
53
+ if (padData)
54
+ x.range([availableWidth * .5 / data[0].values.length, availableWidth * (data[0].values.length - .5) / data[0].values.length ]);
55
+ else
56
+ x.range([0, availableWidth]);
57
+
58
+ y .domain(yDomain || [
59
+ d3.min(data[0].values.map(getLow).concat(forceY)),
60
+ d3.max(data[0].values.map(getHigh).concat(forceY))
61
+ ])
62
+ .range([availableHeight, 0]);
63
+
64
+ // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point
65
+ if (x.domain()[0] === x.domain()[1] || y.domain()[0] === y.domain()[1]) singlePoint = true;
66
+ if (x.domain()[0] === x.domain()[1])
67
+ x.domain()[0] ?
68
+ x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01])
69
+ : x.domain([-1,1]);
70
+
71
+ if (y.domain()[0] === y.domain()[1])
72
+ y.domain()[0] ?
73
+ y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01])
74
+ : y.domain([-1,1]);
75
+
76
+ //------------------------------------------------------------
77
+
78
+
79
+ //------------------------------------------------------------
80
+ // Setup containers and skeleton of chart
81
+
82
+ var wrap = d3.select(this).selectAll('g.nv-wrap.nv-ohlcBar').data([data[0].values]);
83
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-ohlcBar');
84
+ var defsEnter = wrapEnter.append('defs');
85
+ var gEnter = wrapEnter.append('g');
86
+ var g = wrap.select('g');
87
+
88
+ gEnter.append('g').attr('class', 'nv-ticks');
89
+
90
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
91
+
92
+ //------------------------------------------------------------
93
+
94
+
95
+ container
96
+ .on('click', function(d,i) {
97
+ dispatch.chartClick({
98
+ data: d,
99
+ index: i,
100
+ pos: d3.event,
101
+ id: id
102
+ });
103
+ });
104
+
105
+
106
+ defsEnter.append('clipPath')
107
+ .attr('id', 'nv-chart-clip-path-' + id)
108
+ .append('rect');
109
+
110
+ wrap.select('#nv-chart-clip-path-' + id + ' rect')
111
+ .attr('width', availableWidth)
112
+ .attr('height', availableHeight);
113
+
114
+ g .attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : '');
115
+
116
+
117
+
118
+ var ticks = wrap.select('.nv-ticks').selectAll('.nv-tick')
119
+ .data(function(d) { return d });
120
+
121
+ ticks.exit().remove();
122
+
123
+
124
+ var ticksEnter = ticks.enter().append('path')
125
+ .attr('class', function(d,i,j) { return (getOpen(d,i) > getClose(d,i) ? 'nv-tick negative' : 'nv-tick positive') + ' nv-tick-' + j + '-' + i })
126
+ .attr('d', function(d,i) {
127
+ var w = (availableWidth / data[0].values.length) * .9;
128
+ return 'm0,0l0,'
129
+ + (y(getOpen(d,i))
130
+ - y(getHigh(d,i)))
131
+ + 'l'
132
+ + (-w/2)
133
+ + ',0l'
134
+ + (w/2)
135
+ + ',0l0,'
136
+ + (y(getLow(d,i)) - y(getOpen(d,i)))
137
+ + 'l0,'
138
+ + (y(getClose(d,i))
139
+ - y(getLow(d,i)))
140
+ + 'l'
141
+ + (w/2)
142
+ + ',0l'
143
+ + (-w/2)
144
+ + ',0z';
145
+ })
146
+ .attr('transform', function(d,i) { return 'translate(' + x(getX(d,i)) + ',' + y(getHigh(d,i)) + ')'; })
147
+ //.attr('fill', function(d,i) { return color[0]; })
148
+ //.attr('stroke', function(d,i) { return color[0]; })
149
+ //.attr('x', 0 )
150
+ //.attr('y', function(d,i) { return y(Math.max(0, getY(d,i))) })
151
+ //.attr('height', function(d,i) { return Math.abs(y(getY(d,i)) - y(0)) })
152
+ .on('mouseover', function(d,i) {
153
+ d3.select(this).classed('hover', true);
154
+ dispatch.elementMouseover({
155
+ point: d,
156
+ series: data[0],
157
+ pos: [x(getX(d,i)), y(getY(d,i))], // TODO: Figure out why the value appears to be shifted
158
+ pointIndex: i,
159
+ seriesIndex: 0,
160
+ e: d3.event
161
+ });
162
+
163
+ })
164
+ .on('mouseout', function(d,i) {
165
+ d3.select(this).classed('hover', false);
166
+ dispatch.elementMouseout({
167
+ point: d,
168
+ series: data[0],
169
+ pointIndex: i,
170
+ seriesIndex: 0,
171
+ e: d3.event
172
+ });
173
+ })
174
+ .on('click', function(d,i) {
175
+ dispatch.elementClick({
176
+ //label: d[label],
177
+ value: getY(d,i),
178
+ data: d,
179
+ index: i,
180
+ pos: [x(getX(d,i)), y(getY(d,i))],
181
+ e: d3.event,
182
+ id: id
183
+ });
184
+ d3.event.stopPropagation();
185
+ })
186
+ .on('dblclick', function(d,i) {
187
+ dispatch.elementDblClick({
188
+ //label: d[label],
189
+ value: getY(d,i),
190
+ data: d,
191
+ index: i,
192
+ pos: [x(getX(d,i)), y(getY(d,i))],
193
+ e: d3.event,
194
+ id: id
195
+ });
196
+ d3.event.stopPropagation();
197
+ });
198
+
199
+ ticks
200
+ .attr('class', function(d,i,j) { return (getOpen(d,i) > getClose(d,i) ? 'nv-tick negative' : 'nv-tick positive') + ' nv-tick-' + j + '-' + i })
201
+ d3.transition(ticks)
202
+ .attr('transform', function(d,i) { return 'translate(' + x(getX(d,i)) + ',' + y(getHigh(d,i)) + ')'; })
203
+ .attr('d', function(d,i) {
204
+ var w = (availableWidth / data[0].values.length) * .9;
205
+ return 'm0,0l0,'
206
+ + (y(getOpen(d,i))
207
+ - y(getHigh(d,i)))
208
+ + 'l'
209
+ + (-w/2)
210
+ + ',0l'
211
+ + (w/2)
212
+ + ',0l0,'
213
+ + (y(getLow(d,i))
214
+ - y(getOpen(d,i)))
215
+ + 'l0,'
216
+ + (y(getClose(d,i))
217
+ - y(getLow(d,i)))
218
+ + 'l'
219
+ + (w/2)
220
+ + ',0l'
221
+ + (-w/2)
222
+ + ',0z';
223
+ })
224
+ //.attr('width', (availableWidth / data[0].values.length) * .9 )
225
+
226
+
227
+ //d3.transition(ticks)
228
+ //.attr('y', function(d,i) { return y(Math.max(0, getY(d,i))) })
229
+ //.attr('height', function(d,i) { return Math.abs(y(getY(d,i)) - y(0)) });
230
+ //.order(); // not sure if this makes any sense for this model
231
+
232
+ });
233
+
234
+ return chart;
235
+ }
236
+
237
+
238
+ //============================================================
239
+ // Expose Public Variables
240
+ //------------------------------------------------------------
241
+
242
+ chart.dispatch = dispatch;
243
+
244
+ chart.x = function(_) {
245
+ if (!arguments.length) return getX;
246
+ getX = _;
247
+ return chart;
248
+ };
249
+
250
+ chart.y = function(_) {
251
+ if (!arguments.length) return getY;
252
+ getY = _;
253
+ return chart;
254
+ };
255
+
256
+ chart.open = function(_) {
257
+ if (!arguments.length) return getOpen;
258
+ getOpen = _;
259
+ return chart;
260
+ };
261
+
262
+ chart.close = function(_) {
263
+ if (!arguments.length) return getClose;
264
+ getClose = _;
265
+ return chart;
266
+ };
267
+
268
+ chart.high = function(_) {
269
+ if (!arguments.length) return getHigh;
270
+ getHigh = _;
271
+ return chart;
272
+ };
273
+
274
+ chart.low = function(_) {
275
+ if (!arguments.length) return getLow;
276
+ getLow = _;
277
+ return chart;
278
+ };
279
+
280
+ chart.margin = function(_) {
281
+ if (!arguments.length) return margin;
282
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
283
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
284
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
285
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
286
+ return chart;
287
+ };
288
+
289
+ chart.width = function(_) {
290
+ if (!arguments.length) return width;
291
+ width = _;
292
+ return chart;
293
+ };
294
+
295
+ chart.height = function(_) {
296
+ if (!arguments.length) return height;
297
+ height = _;
298
+ return chart;
299
+ };
300
+
301
+ chart.xScale = function(_) {
302
+ if (!arguments.length) return x;
303
+ x = _;
304
+ return chart;
305
+ };
306
+
307
+ chart.yScale = function(_) {
308
+ if (!arguments.length) return y;
309
+ y = _;
310
+ return chart;
311
+ };
312
+
313
+ chart.xDomain = function(_) {
314
+ if (!arguments.length) return xDomain;
315
+ xDomain = _;
316
+ return chart;
317
+ };
318
+
319
+ chart.yDomain = function(_) {
320
+ if (!arguments.length) return yDomain;
321
+ yDomain = _;
322
+ return chart;
323
+ };
324
+
325
+ chart.forceX = function(_) {
326
+ if (!arguments.length) return forceX;
327
+ forceX = _;
328
+ return chart;
329
+ };
330
+
331
+ chart.forceY = function(_) {
332
+ if (!arguments.length) return forceY;
333
+ forceY = _;
334
+ return chart;
335
+ };
336
+
337
+ chart.padData = function(_) {
338
+ if (!arguments.length) return padData;
339
+ padData = _;
340
+ return chart;
341
+ };
342
+
343
+ chart.clipEdge = function(_) {
344
+ if (!arguments.length) return clipEdge;
345
+ clipEdge = _;
346
+ return chart;
347
+ };
348
+
349
+ chart.color = function(_) {
350
+ if (!arguments.length) return color;
351
+ color = nv.utils.getColor(_);
352
+ return chart;
353
+ };
354
+
355
+ chart.id = function(_) {
356
+ if (!arguments.length) return id;
357
+ id = _;
358
+ return chart;
359
+ };
360
+
361
+ //============================================================
362
+
363
+
364
+ return chart;
365
+ }
@@ -0,0 +1,238 @@
1
+
2
+ //Code adapted from Jason Davies' "Parallel Coordinates"
3
+ // http://bl.ocks.org/jasondavies/1341281
4
+
5
+ nv.models.parallelCoordinates = function() {
6
+
7
+ //============================================================
8
+ // Public Variables with Default Settings
9
+ //------------------------------------------------------------
10
+
11
+
12
+ var margin = {top: 30, right: 10, bottom: 10, left: 10}
13
+ , width = 960
14
+ , height = 500
15
+ , x = d3.scale.ordinal()
16
+ , y = {}
17
+ , dimensions = []
18
+ , color = nv.utils.getColor(d3.scale.category20c().range())
19
+ , axisLabel = function(d) { return d; }
20
+ , filters = []
21
+ , active = []
22
+ , dispatch = d3.dispatch('brush')
23
+ ;
24
+
25
+ //============================================================
26
+
27
+
28
+ //============================================================
29
+ // Private Variables
30
+ //------------------------------------------------------------
31
+
32
+
33
+ //============================================================
34
+
35
+
36
+ function chart(selection) {
37
+ selection.each(function(data) {
38
+ var availableWidth = width - margin.left - margin.right,
39
+ availableHeight = height - margin.top - margin.bottom,
40
+ container = d3.select(this);
41
+
42
+ active = data; //set all active before first brush call
43
+
44
+ chart.update = function() { }; //This is a placeholder until this chart is made resizeable
45
+
46
+ //------------------------------------------------------------
47
+ // Setup Scales
48
+
49
+ x
50
+ .rangePoints([0, availableWidth], 1)
51
+ .domain(dimensions);
52
+
53
+ // Extract the list of dimensions and create a scale for each.
54
+ dimensions.forEach(function(d) {
55
+ y[d] = d3.scale.linear()
56
+ .domain(d3.extent(data, function(p) { return +p[d]; }))
57
+ .range([availableHeight, 0]);
58
+
59
+ y[d].brush = d3.svg.brush().y(y[d]).on('brush', brush);
60
+
61
+ return d != 'name';
62
+ })
63
+
64
+
65
+ //------------------------------------------------------------
66
+
67
+
68
+ //------------------------------------------------------------
69
+ // Setup containers and skeleton of chart
70
+
71
+ var wrap = container.selectAll('g.nv-wrap.nv-parallelCoordinates').data([data]);
72
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-parallelCoordinates');
73
+ var gEnter = wrapEnter.append('g');
74
+ var g = wrap.select('g')
75
+
76
+ gEnter.append('g').attr('class', 'nv-parallelCoordinatesWrap');
77
+
78
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
79
+
80
+ //------------------------------------------------------------
81
+
82
+
83
+ var line = d3.svg.line(),
84
+ axis = d3.svg.axis().orient('left'),
85
+ background,
86
+ foreground;
87
+
88
+
89
+ // Add grey background lines for context.
90
+ background = gEnter.append('g')
91
+ .attr('class', 'background')
92
+ .selectAll('path')
93
+ .data(data)
94
+ .enter().append('path')
95
+ .attr('d', path)
96
+ ;
97
+
98
+ // Add blue foreground lines for focus.
99
+ foreground = gEnter.append('g')
100
+ .attr('class', 'foreground')
101
+ .selectAll('path')
102
+ .data(data)
103
+ .enter().append('path')
104
+ .attr('d', path)
105
+ ;
106
+
107
+ // Add a group element for each dimension.
108
+ var dimension = g.selectAll('.dimension')
109
+ .data(dimensions)
110
+ .enter().append('g')
111
+ .attr('class', 'dimension')
112
+ .attr('transform', function(d) { return 'translate(' + x(d) + ',0)'; });
113
+
114
+ // Add an axis and title.
115
+ dimension.append('g')
116
+ .attr('class', 'axis')
117
+ .each(function(d) { d3.select(this).call(axis.scale(y[d])); })
118
+ .append('text')
119
+ .attr('text-anchor', 'middle')
120
+ .attr('y', -9)
121
+ .text(String);
122
+
123
+ // Add and store a brush for each axis.
124
+ dimension.append('g')
125
+ .attr('class', 'brush')
126
+ .each(function(d) { d3.select(this).call(y[d].brush); })
127
+ .selectAll('rect')
128
+ .attr('x', -8)
129
+ .attr('width', 16);
130
+
131
+
132
+ // Returns the path for a given data point.
133
+ function path(d) {
134
+ return line(dimensions.map(function(p) { return [x(p), y[p](d[p])]; }));
135
+ }
136
+
137
+ // Handles a brush event, toggling the display of foreground lines.
138
+ function brush() {
139
+ var actives = dimensions.filter(function(p) { return !y[p].brush.empty(); }),
140
+ extents = actives.map(function(p) { return y[p].brush.extent(); });
141
+
142
+ filters = []; //erase current filters
143
+ actives.forEach(function(d,i) {
144
+ filters[i] = {
145
+ dimension: d,
146
+ extent: extents[i]
147
+ }
148
+ });
149
+
150
+ active = []; //erase current active list
151
+ foreground.style('display', function(d) {
152
+ var isActive = actives.every(function(p, i) {
153
+ return extents[i][0] <= d[p] && d[p] <= extents[i][1];
154
+ });
155
+ if (isActive) active.push(d);
156
+ return isActive ? null : 'none';
157
+ });
158
+
159
+ dispatch.brush({
160
+ filters: filters,
161
+ active: active
162
+ });
163
+
164
+ }
165
+
166
+
167
+
168
+ });
169
+
170
+ return chart;
171
+ }
172
+
173
+
174
+ //============================================================
175
+ // Expose Public Variables
176
+ //------------------------------------------------------------
177
+
178
+
179
+ chart.dispatch = dispatch;
180
+
181
+ chart.margin = function(_) {
182
+ if (!arguments.length) return margin;
183
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
184
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
185
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
186
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
187
+ return chart;
188
+ };
189
+
190
+ chart.width = function(_) {
191
+ if (!arguments.length) return width;
192
+ width = _;
193
+ return chart;
194
+ };
195
+
196
+ chart.height = function(_) {
197
+ if (!arguments.length) return height;
198
+ height = _;
199
+ return chart;
200
+ };
201
+
202
+ chart.color = function(_) {
203
+ if (!arguments.length) return color;
204
+ color = nv.utils.getColor(_)
205
+ return chart;
206
+ };
207
+
208
+ chart.xScale = function(_) {
209
+ if (!arguments.length) return x;
210
+ x = _;
211
+ return chart;
212
+ };
213
+
214
+ chart.yScale = function(_) {
215
+ if (!arguments.length) return y;
216
+ y = _;
217
+ return chart;
218
+ };
219
+
220
+ chart.dimensions = function(_) {
221
+ if (!arguments.length) return dimensions;
222
+ dimensions = _;
223
+ return chart;
224
+ };
225
+
226
+ chart.filters = function() {
227
+ return filters;
228
+ };
229
+
230
+ chart.active = function() {
231
+ return active;
232
+ };
233
+
234
+ //============================================================
235
+
236
+
237
+ return chart;
238
+ }