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,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
+ }