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,327 @@
1
+ //TODO: consider deprecating by adding necessary features to multiBar model
2
+ nv.models.discreteBar = 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.ordinal()
13
+ , y = d3.scale.linear()
14
+ , getX = function(d) { return d.x }
15
+ , getY = function(d) { return d.y }
16
+ , forceY = [0] // 0 is forced by default.. this makes sense for the majority of bar graphs... user can always do chart.forceY([]) to remove
17
+ , color = nv.utils.defaultColor()
18
+ , showValues = false
19
+ , valueFormat = d3.format(',.2f')
20
+ , xDomain
21
+ , yDomain
22
+ , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout')
23
+ , rectClass = 'discreteBar'
24
+ ;
25
+
26
+ //============================================================
27
+
28
+
29
+ //============================================================
30
+ // Private Variables
31
+ //------------------------------------------------------------
32
+
33
+ var x0, y0;
34
+
35
+ //============================================================
36
+
37
+
38
+ function chart(selection) {
39
+ selection.each(function(data) {
40
+ var availableWidth = width - margin.left - margin.right,
41
+ availableHeight = height - margin.top - margin.bottom,
42
+ container = d3.select(this);
43
+
44
+
45
+ //add series index to each data point for reference
46
+ data = data.map(function(series, i) {
47
+ series.values = series.values.map(function(point) {
48
+ point.series = i;
49
+ return point;
50
+ });
51
+ return series;
52
+ });
53
+
54
+
55
+ //------------------------------------------------------------
56
+ // Setup Scales
57
+
58
+ // remap and flatten the data for use in calculating the scales' domains
59
+ var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate
60
+ data.map(function(d) {
61
+ return d.values.map(function(d,i) {
62
+ return { x: getX(d,i), y: getY(d,i), y0: d.y0 }
63
+ })
64
+ });
65
+
66
+ x .domain(xDomain || d3.merge(seriesData).map(function(d) { return d.x }))
67
+ .rangeBands([0, availableWidth], .1);
68
+
69
+ y .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return d.y }).concat(forceY)));
70
+
71
+
72
+ // If showValues, pad the Y axis range to account for label height
73
+ if (showValues) y.range([availableHeight - (y.domain()[0] < 0 ? 12 : 0), y.domain()[1] > 0 ? 12 : 0]);
74
+ else y.range([availableHeight, 0]);
75
+
76
+ //store old scales if they exist
77
+ x0 = x0 || x;
78
+ y0 = y0 || y.copy().range([y(0),y(0)]);
79
+
80
+ //------------------------------------------------------------
81
+
82
+
83
+ //------------------------------------------------------------
84
+ // Setup containers and skeleton of chart
85
+
86
+ var wrap = container.selectAll('g.nv-wrap.nv-discretebar').data([data]);
87
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-discretebar');
88
+ var gEnter = wrapEnter.append('g');
89
+ var g = wrap.select('g');
90
+
91
+ gEnter.append('g').attr('class', 'nv-groups');
92
+
93
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
94
+
95
+ //------------------------------------------------------------
96
+
97
+
98
+
99
+ //TODO: by definition, the discrete bar should not have multiple groups, will modify/remove later
100
+ var groups = wrap.select('.nv-groups').selectAll('.nv-group')
101
+ .data(function(d) { return d }, function(d) { return d.key });
102
+ groups.enter().append('g')
103
+ .style('stroke-opacity', 1e-6)
104
+ .style('fill-opacity', 1e-6);
105
+ d3.transition(groups.exit())
106
+ .style('stroke-opacity', 1e-6)
107
+ .style('fill-opacity', 1e-6)
108
+ .remove();
109
+ groups
110
+ .attr('class', function(d,i) { return 'nv-group nv-series-' + i })
111
+ .classed('hover', function(d) { return d.hover });
112
+ d3.transition(groups)
113
+ .style('stroke-opacity', 1)
114
+ .style('fill-opacity', .75);
115
+
116
+
117
+ var bars = groups.selectAll('g.nv-bar')
118
+ .data(function(d) { return d.values });
119
+
120
+ bars.exit().remove();
121
+
122
+
123
+ var barsEnter = bars.enter().append('g')
124
+ .attr('transform', function(d,i,j) {
125
+ return 'translate(' + (x(getX(d,i)) + x.rangeBand() * .05 ) + ', ' + y(0) + ')'
126
+ })
127
+ .on('mouseover', function(d,i) { //TODO: figure out why j works above, but not here
128
+ d3.select(this).classed('hover', true);
129
+ dispatch.elementMouseover({
130
+ value: getY(d,i),
131
+ point: d,
132
+ series: data[d.series],
133
+ pos: [x(getX(d,i)) + (x.rangeBand() * (d.series + .5) / data.length), y(getY(d,i))], // TODO: Figure out why the value appears to be shifted
134
+ pointIndex: i,
135
+ seriesIndex: d.series,
136
+ e: d3.event
137
+ });
138
+ })
139
+ .on('mouseout', function(d,i) {
140
+ d3.select(this).classed('hover', false);
141
+ dispatch.elementMouseout({
142
+ value: getY(d,i),
143
+ point: d,
144
+ series: data[d.series],
145
+ pointIndex: i,
146
+ seriesIndex: d.series,
147
+ e: d3.event
148
+ });
149
+ })
150
+ .on('click', function(d,i) {
151
+ dispatch.elementClick({
152
+ value: getY(d,i),
153
+ point: d,
154
+ series: data[d.series],
155
+ pos: [x(getX(d,i)) + (x.rangeBand() * (d.series + .5) / data.length), y(getY(d,i))], // TODO: Figure out why the value appears to be shifted
156
+ pointIndex: i,
157
+ seriesIndex: d.series,
158
+ e: d3.event
159
+ });
160
+ d3.event.stopPropagation();
161
+ })
162
+ .on('dblclick', function(d,i) {
163
+ dispatch.elementDblClick({
164
+ value: getY(d,i),
165
+ point: d,
166
+ series: data[d.series],
167
+ pos: [x(getX(d,i)) + (x.rangeBand() * (d.series + .5) / data.length), y(getY(d,i))], // TODO: Figure out why the value appears to be shifted
168
+ pointIndex: i,
169
+ seriesIndex: d.series,
170
+ e: d3.event
171
+ });
172
+ d3.event.stopPropagation();
173
+ });
174
+
175
+ barsEnter.append('rect')
176
+ .attr('height', 0)
177
+ .attr('width', x.rangeBand() * .9 / data.length )
178
+
179
+ if (showValues) {
180
+ barsEnter.append('text')
181
+ .attr('text-anchor', 'middle')
182
+ bars.select('text')
183
+ .attr('x', x.rangeBand() * .9 / 2)
184
+ .attr('y', function(d,i) { return getY(d,i) < 0 ? y(getY(d,i)) - y(0) + 12 : -4 })
185
+ .text(function(d,i) { return valueFormat(getY(d,i)) });
186
+ } else {
187
+ bars.selectAll('text').remove();
188
+ }
189
+
190
+ bars
191
+ .attr('class', function(d,i) { return getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive' })
192
+ .style('fill', function(d,i) { return d.color || color(d,i) })
193
+ .style('stroke', function(d,i) { return d.color || color(d,i) })
194
+ .select('rect')
195
+ .attr('class', rectClass)
196
+ .attr('width', x.rangeBand() * .9 / data.length);
197
+ d3.transition(bars)
198
+ //.delay(function(d,i) { return i * 1200 / data[0].values.length })
199
+ .attr('transform', function(d,i) {
200
+ var left = x(getX(d,i)) + x.rangeBand() * .05,
201
+ top = getY(d,i) < 0 ?
202
+ y(0) :
203
+ y(0) - y(getY(d,i)) < 1 ?
204
+ y(0) - 1 : //make 1 px positive bars show up above y=0
205
+ y(getY(d,i));
206
+
207
+ return 'translate(' + left + ', ' + top + ')'
208
+ })
209
+ .select('rect')
210
+ .attr('height', function(d,i) {
211
+ return Math.max(Math.abs(y(getY(d,i)) - y(0)) || 1)
212
+ });
213
+
214
+
215
+ //store old scales for use in transitions on update
216
+ x0 = x.copy();
217
+ y0 = y.copy();
218
+
219
+ });
220
+
221
+ return chart;
222
+ }
223
+
224
+
225
+ //============================================================
226
+ // Expose Public Variables
227
+ //------------------------------------------------------------
228
+
229
+ chart.dispatch = dispatch;
230
+
231
+ chart.x = function(_) {
232
+ if (!arguments.length) return getX;
233
+ getX = _;
234
+ return chart;
235
+ };
236
+
237
+ chart.y = function(_) {
238
+ if (!arguments.length) return getY;
239
+ getY = _;
240
+ return chart;
241
+ };
242
+
243
+ chart.margin = function(_) {
244
+ if (!arguments.length) return margin;
245
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
246
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
247
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
248
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
249
+ return chart;
250
+ };
251
+
252
+ chart.width = function(_) {
253
+ if (!arguments.length) return width;
254
+ width = _;
255
+ return chart;
256
+ };
257
+
258
+ chart.height = function(_) {
259
+ if (!arguments.length) return height;
260
+ height = _;
261
+ return chart;
262
+ };
263
+
264
+ chart.xScale = function(_) {
265
+ if (!arguments.length) return x;
266
+ x = _;
267
+ return chart;
268
+ };
269
+
270
+ chart.yScale = function(_) {
271
+ if (!arguments.length) return y;
272
+ y = _;
273
+ return chart;
274
+ };
275
+
276
+ chart.xDomain = function(_) {
277
+ if (!arguments.length) return xDomain;
278
+ xDomain = _;
279
+ return chart;
280
+ };
281
+
282
+ chart.yDomain = function(_) {
283
+ if (!arguments.length) return yDomain;
284
+ yDomain = _;
285
+ return chart;
286
+ };
287
+
288
+ chart.forceY = function(_) {
289
+ if (!arguments.length) return forceY;
290
+ forceY = _;
291
+ return chart;
292
+ };
293
+
294
+ chart.color = function(_) {
295
+ if (!arguments.length) return color;
296
+ color = nv.utils.getColor(_);
297
+ return chart;
298
+ };
299
+
300
+ chart.id = function(_) {
301
+ if (!arguments.length) return id;
302
+ id = _;
303
+ return chart;
304
+ };
305
+
306
+ chart.showValues = function(_) {
307
+ if (!arguments.length) return showValues;
308
+ showValues = _;
309
+ return chart;
310
+ };
311
+
312
+ chart.valueFormat= function(_) {
313
+ if (!arguments.length) return valueFormat;
314
+ valueFormat = _;
315
+ return chart;
316
+ };
317
+
318
+ chart.rectClass= function(_) {
319
+ if (!arguments.length) return rectClass;
320
+ rectClass = _;
321
+ return chart;
322
+ }
323
+ //============================================================
324
+
325
+
326
+ return chart;
327
+ }
@@ -0,0 +1,290 @@
1
+
2
+ nv.models.discreteBarChart = function() {
3
+
4
+ //============================================================
5
+ // Public Variables with Default Settings
6
+ //------------------------------------------------------------
7
+
8
+ var discretebar = nv.models.discreteBar()
9
+ , xAxis = nv.models.axis()
10
+ , yAxis = nv.models.axis()
11
+ ;
12
+
13
+ var margin = {top: 15, right: 10, bottom: 50, left: 60}
14
+ , width = null
15
+ , height = null
16
+ , color = nv.utils.getColor()
17
+ , staggerLabels = false
18
+ , tooltips = true
19
+ , tooltip = function(key, x, y, e, graph) {
20
+ return '<h3>' + x + '</h3>' +
21
+ '<p>' + y + '</p>'
22
+ }
23
+ , x
24
+ , y
25
+ , noData = "No Data Available."
26
+ , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'beforeUpdate')
27
+ ;
28
+
29
+ xAxis
30
+ .orient('bottom')
31
+ .highlightZero(false)
32
+ .showMaxMin(false)
33
+ .tickFormat(function(d) { return d })
34
+ ;
35
+ yAxis
36
+ .orient('left')
37
+ .tickFormat(d3.format(',.1f'))
38
+ ;
39
+
40
+ //============================================================
41
+
42
+
43
+ //============================================================
44
+ // Private Variables
45
+ //------------------------------------------------------------
46
+
47
+ var showTooltip = function(e, offsetElement) {
48
+ var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ),
49
+ top = e.pos[1] + ( offsetElement.offsetTop || 0),
50
+ x = xAxis.tickFormat()(discretebar.x()(e.point, e.pointIndex)),
51
+ y = yAxis.tickFormat()(discretebar.y()(e.point, e.pointIndex)),
52
+ content = tooltip(e.series.key, x, y, e, chart);
53
+
54
+ nv.tooltip.show([left, top], content, e.value < 0 ? 'n' : 's', null, offsetElement);
55
+ };
56
+
57
+ //============================================================
58
+
59
+
60
+ function chart(selection) {
61
+ selection.each(function(data) {
62
+ var container = d3.select(this),
63
+ that = this;
64
+
65
+ var availableWidth = (width || parseInt(container.style('width')) || 960)
66
+ - margin.left - margin.right,
67
+ availableHeight = (height || parseInt(container.style('height')) || 400)
68
+ - margin.top - margin.bottom;
69
+
70
+
71
+ chart.update = function() { dispatch.beforeUpdate(); container.transition().call(chart); };
72
+ chart.container = this;
73
+
74
+
75
+ //------------------------------------------------------------
76
+ // Display No Data message if there's nothing to show.
77
+
78
+ if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {
79
+ var noDataText = container.selectAll('.nv-noData').data([noData]);
80
+
81
+ noDataText.enter().append('text')
82
+ .attr('class', 'nvd3 nv-noData')
83
+ .attr('dy', '-.7em')
84
+ .style('text-anchor', 'middle');
85
+
86
+ noDataText
87
+ .attr('x', margin.left + availableWidth / 2)
88
+ .attr('y', margin.top + availableHeight / 2)
89
+ .text(function(d) { return d });
90
+
91
+ return chart;
92
+ } else {
93
+ container.selectAll('.nv-noData').remove();
94
+ }
95
+
96
+ //------------------------------------------------------------
97
+
98
+
99
+ //------------------------------------------------------------
100
+ // Setup Scales
101
+
102
+ x = discretebar.xScale();
103
+ y = discretebar.yScale();
104
+
105
+ //------------------------------------------------------------
106
+
107
+
108
+ //------------------------------------------------------------
109
+ // Setup containers and skeleton of chart
110
+
111
+ var wrap = container.selectAll('g.nv-wrap.nv-discreteBarWithAxes').data([data]);
112
+ var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-discreteBarWithAxes').append('g');
113
+ var defsEnter = gEnter.append('defs');
114
+ var g = wrap.select('g');
115
+
116
+ gEnter.append('g').attr('class', 'nv-x nv-axis');
117
+ gEnter.append('g').attr('class', 'nv-y nv-axis');
118
+ gEnter.append('g').attr('class', 'nv-barsWrap');
119
+
120
+ g.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
121
+
122
+ //------------------------------------------------------------
123
+
124
+
125
+ //------------------------------------------------------------
126
+ // Main Chart Component(s)
127
+
128
+ discretebar
129
+ .width(availableWidth)
130
+ .height(availableHeight);
131
+
132
+
133
+ var barsWrap = g.select('.nv-barsWrap')
134
+ .datum(data.filter(function(d) { return !d.disabled }))
135
+
136
+ d3.transition(barsWrap).call(discretebar);
137
+
138
+ //------------------------------------------------------------
139
+
140
+
141
+
142
+ defsEnter.append('clipPath')
143
+ .attr('id', 'nv-x-label-clip-' + discretebar.id())
144
+ .append('rect');
145
+
146
+ g.select('#nv-x-label-clip-' + discretebar.id() + ' rect')
147
+ .attr('width', x.rangeBand() * (staggerLabels ? 2 : 1))
148
+ .attr('height', 16)
149
+ .attr('x', -x.rangeBand() / (staggerLabels ? 1 : 2 ));
150
+
151
+
152
+ //------------------------------------------------------------
153
+ // Setup Axes
154
+
155
+ xAxis
156
+ .scale(x)
157
+ .ticks( availableWidth / 100 )
158
+ .tickSize(-availableHeight, 0);
159
+
160
+ g.select('.nv-x.nv-axis')
161
+ .attr('transform', 'translate(0,' + (y.range()[0] + ((discretebar.showValues() && y.domain()[0] < 0) ? 16 : 0)) + ')');
162
+ //d3.transition(g.select('.nv-x.nv-axis'))
163
+ g.select('.nv-x.nv-axis').transition().duration(0)
164
+ .call(xAxis);
165
+
166
+
167
+ var xTicks = g.select('.nv-x.nv-axis').selectAll('g');
168
+
169
+ if (staggerLabels) {
170
+ xTicks
171
+ .selectAll('text')
172
+ .attr('transform', function(d,i,j) { return 'translate(0,' + (j % 2 == 0 ? '5' : '17') + ')' })
173
+ }
174
+
175
+ yAxis
176
+ .scale(y)
177
+ .ticks( availableHeight / 36 )
178
+ .tickSize( -availableWidth, 0);
179
+
180
+ d3.transition(g.select('.nv-y.nv-axis'))
181
+ .call(yAxis);
182
+
183
+ //------------------------------------------------------------
184
+
185
+
186
+ //============================================================
187
+ // Event Handling/Dispatching (in chart's scope)
188
+ //------------------------------------------------------------
189
+
190
+ dispatch.on('tooltipShow', function(e) {
191
+ if (tooltips) showTooltip(e, that.parentNode);
192
+ });
193
+
194
+ //============================================================
195
+
196
+
197
+ });
198
+
199
+ return chart;
200
+ }
201
+
202
+ //============================================================
203
+ // Event Handling/Dispatching (out of chart's scope)
204
+ //------------------------------------------------------------
205
+
206
+ discretebar.dispatch.on('elementMouseover.tooltip', function(e) {
207
+ e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top];
208
+ dispatch.tooltipShow(e);
209
+ });
210
+
211
+ discretebar.dispatch.on('elementMouseout.tooltip', function(e) {
212
+ dispatch.tooltipHide(e);
213
+ });
214
+
215
+ dispatch.on('tooltipHide', function() {
216
+ if (tooltips) nv.tooltip.cleanup();
217
+ });
218
+
219
+ //============================================================
220
+
221
+
222
+ //============================================================
223
+ // Expose Public Variables
224
+ //------------------------------------------------------------
225
+
226
+ // expose chart's sub-components
227
+ chart.dispatch = dispatch;
228
+ chart.discretebar = discretebar;
229
+ chart.xAxis = xAxis;
230
+ chart.yAxis = yAxis;
231
+
232
+ d3.rebind(chart, discretebar, 'x', 'y', 'xDomain', 'yDomain', 'forceX', 'forceY', 'id', 'showValues', 'valueFormat');
233
+
234
+ chart.margin = function(_) {
235
+ if (!arguments.length) return margin;
236
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
237
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
238
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
239
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
240
+ return chart;
241
+ };
242
+
243
+ chart.width = function(_) {
244
+ if (!arguments.length) return width;
245
+ width = _;
246
+ return chart;
247
+ };
248
+
249
+ chart.height = function(_) {
250
+ if (!arguments.length) return height;
251
+ height = _;
252
+ return chart;
253
+ };
254
+
255
+ chart.color = function(_) {
256
+ if (!arguments.length) return color;
257
+ color = nv.utils.getColor(_);
258
+ discretebar.color(color);
259
+ return chart;
260
+ };
261
+
262
+ chart.staggerLabels = function(_) {
263
+ if (!arguments.length) return staggerLabels;
264
+ staggerLabels = _;
265
+ return chart;
266
+ };
267
+
268
+ chart.tooltips = function(_) {
269
+ if (!arguments.length) return tooltips;
270
+ tooltips = _;
271
+ return chart;
272
+ };
273
+
274
+ chart.tooltipContent = function(_) {
275
+ if (!arguments.length) return tooltip;
276
+ tooltip = _;
277
+ return chart;
278
+ };
279
+
280
+ chart.noData = function(_) {
281
+ if (!arguments.length) return noData;
282
+ noData = _;
283
+ return chart;
284
+ };
285
+
286
+ //============================================================
287
+
288
+
289
+ return chart;
290
+ }