nvd3-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. data/.gitmodules +3 -0
  2. data/README.md +101 -0
  3. data/lib/nvd3-rails.rb +1 -0
  4. data/lib/nvd3/rails.rb +8 -0
  5. data/lib/nvd3/rails/engine.rb +6 -0
  6. data/lib/nvd3/rails/version.rb +5 -0
  7. data/nvd3-rails.gemspec +21 -0
  8. data/vendor/assets/javascripts/nvd3-rails.js +7 -0
  9. data/vendor/assets/javascripts/nvd3/.git.sample/HEAD +1 -0
  10. data/vendor/assets/javascripts/nvd3/.git.sample/config +13 -0
  11. data/vendor/assets/javascripts/nvd3/.git.sample/description +1 -0
  12. data/vendor/assets/javascripts/nvd3/.git.sample/hooks/applypatch-msg.sample +15 -0
  13. data/vendor/assets/javascripts/nvd3/.git.sample/hooks/commit-msg.sample +24 -0
  14. data/vendor/assets/javascripts/nvd3/.git.sample/hooks/post-update.sample +8 -0
  15. data/vendor/assets/javascripts/nvd3/.git.sample/hooks/pre-applypatch.sample +14 -0
  16. data/vendor/assets/javascripts/nvd3/.git.sample/hooks/pre-commit.sample +50 -0
  17. data/vendor/assets/javascripts/nvd3/.git.sample/hooks/pre-push.sample +53 -0
  18. data/vendor/assets/javascripts/nvd3/.git.sample/hooks/pre-rebase.sample +169 -0
  19. data/vendor/assets/javascripts/nvd3/.git.sample/hooks/prepare-commit-msg.sample +36 -0
  20. data/vendor/assets/javascripts/nvd3/.git.sample/hooks/update.sample +128 -0
  21. data/vendor/assets/javascripts/nvd3/.git.sample/index +0 -0
  22. data/vendor/assets/javascripts/nvd3/.git.sample/info/exclude +6 -0
  23. data/vendor/assets/javascripts/nvd3/.git.sample/logs/HEAD +1 -0
  24. data/vendor/assets/javascripts/nvd3/.git.sample/logs/refs/heads/master +1 -0
  25. data/vendor/assets/javascripts/nvd3/.git.sample/logs/refs/remotes/origin/HEAD +1 -0
  26. data/vendor/assets/javascripts/nvd3/.git.sample/objects/pack/pack-babbb312d58dd7f03870b530a1b9a84c80918be3.idx +0 -0
  27. data/vendor/assets/javascripts/nvd3/.git.sample/objects/pack/pack-babbb312d58dd7f03870b530a1b9a84c80918be3.pack +0 -0
  28. data/vendor/assets/javascripts/nvd3/.git.sample/packed-refs +5 -0
  29. data/vendor/assets/javascripts/nvd3/.git.sample/refs/heads/master +1 -0
  30. data/vendor/assets/javascripts/nvd3/.git.sample/refs/remotes/origin/HEAD +1 -0
  31. data/vendor/assets/javascripts/nvd3/.gitignore +24 -0
  32. data/vendor/assets/javascripts/nvd3/LICENSE.md +49 -0
  33. data/vendor/assets/javascripts/nvd3/Makefile +56 -0
  34. data/vendor/assets/javascripts/nvd3/README.md +43 -0
  35. data/vendor/assets/javascripts/nvd3/build.bat +6 -0
  36. data/vendor/assets/javascripts/nvd3/deprecated/bar.html +198 -0
  37. data/vendor/assets/javascripts/nvd3/deprecated/bar.js +250 -0
  38. data/vendor/assets/javascripts/nvd3/deprecated/charts/cumulativeLineChart.js +174 -0
  39. data/vendor/assets/javascripts/nvd3/deprecated/charts/discreteBarChart.js +157 -0
  40. data/vendor/assets/javascripts/nvd3/deprecated/charts/lineChart.js +159 -0
  41. data/vendor/assets/javascripts/nvd3/deprecated/charts/lineChartDaily.js +168 -0
  42. data/vendor/assets/javascripts/nvd3/deprecated/charts/stackedAreaChart.js +177 -0
  43. data/vendor/assets/javascripts/nvd3/deprecated/cumulativeLine.html +171 -0
  44. data/vendor/assets/javascripts/nvd3/deprecated/cumulativeLine.js +334 -0
  45. data/vendor/assets/javascripts/nvd3/deprecated/discreteBarChartWithEnabledTooltip.html +129 -0
  46. data/vendor/assets/javascripts/nvd3/deprecated/discreteBarChartWithEnabledTooltip.js +222 -0
  47. data/vendor/assets/javascripts/nvd3/deprecated/discreteBarWithAxes.html +172 -0
  48. data/vendor/assets/javascripts/nvd3/deprecated/discreteBarWithAxes.js +152 -0
  49. data/vendor/assets/javascripts/nvd3/deprecated/lineChart-old.html +83 -0
  50. data/vendor/assets/javascripts/nvd3/deprecated/lineChartDaily.html +109 -0
  51. data/vendor/assets/javascripts/nvd3/deprecated/linePlusBar.html +173 -0
  52. data/vendor/assets/javascripts/nvd3/deprecated/linePlusBar.js +250 -0
  53. data/vendor/assets/javascripts/nvd3/deprecated/lineWithFocus.html +137 -0
  54. data/vendor/assets/javascripts/nvd3/deprecated/lineWithFocus.js +354 -0
  55. data/vendor/assets/javascripts/nvd3/deprecated/lineWithFourAxes.html +144 -0
  56. data/vendor/assets/javascripts/nvd3/deprecated/lineWithFourAxes.js +218 -0
  57. data/vendor/assets/javascripts/nvd3/deprecated/lineWithLegend.html +142 -0
  58. data/vendor/assets/javascripts/nvd3/deprecated/lineWithLegend.js +176 -0
  59. data/vendor/assets/javascripts/nvd3/deprecated/monthendAxis.html +99 -0
  60. data/vendor/assets/javascripts/nvd3/deprecated/multiBarHorizontalWithLegend.html +258 -0
  61. data/vendor/assets/javascripts/nvd3/deprecated/multiBarHorizontalWithLegend.js +226 -0
  62. data/vendor/assets/javascripts/nvd3/deprecated/multiBarWithLegend.html +162 -0
  63. data/vendor/assets/javascripts/nvd3/deprecated/multiBarWithLegend.js +249 -0
  64. data/vendor/assets/javascripts/nvd3/deprecated/pie.js +263 -0
  65. data/vendor/assets/javascripts/nvd3/deprecated/scatterChart.html +110 -0
  66. data/vendor/assets/javascripts/nvd3/deprecated/scatterChart.js +294 -0
  67. data/vendor/assets/javascripts/nvd3/deprecated/scatterFisheyeChart.js +418 -0
  68. data/vendor/assets/javascripts/nvd3/deprecated/scatterWithLegend.html +167 -0
  69. data/vendor/assets/javascripts/nvd3/deprecated/scatterWithLegend.js +261 -0
  70. data/vendor/assets/javascripts/nvd3/deprecated/stackedArea.js +286 -0
  71. data/vendor/assets/javascripts/nvd3/deprecated/stackedAreaChart.html +183 -0
  72. data/vendor/assets/javascripts/nvd3/deprecated/stackedAreaChart_old.html +137 -0
  73. data/vendor/assets/javascripts/nvd3/deprecated/stackedAreaWithLegend.html +222 -0
  74. data/vendor/assets/javascripts/nvd3/deprecated/stackedAreaWithLegend.js +297 -0
  75. data/vendor/assets/javascripts/nvd3/examples/bullet.html +96 -0
  76. data/vendor/assets/javascripts/nvd3/examples/bulletChart.html +94 -0
  77. data/vendor/assets/javascripts/nvd3/examples/crossfilter.html +167 -0
  78. data/vendor/assets/javascripts/nvd3/examples/crossfilterWithDimentions.html +180 -0
  79. data/vendor/assets/javascripts/nvd3/examples/crossfilterWithTables.html +288 -0
  80. data/vendor/assets/javascripts/nvd3/examples/cumulativeLineChart.html +155 -0
  81. data/vendor/assets/javascripts/nvd3/examples/discreteBarChart.html +116 -0
  82. data/vendor/assets/javascripts/nvd3/examples/dynamicTimeSeries.html +148 -0
  83. data/vendor/assets/javascripts/nvd3/examples/historicalBar.html +157 -0
  84. data/vendor/assets/javascripts/nvd3/examples/horizon.html +163 -0
  85. data/vendor/assets/javascripts/nvd3/examples/images/grey-minus.png +0 -0
  86. data/vendor/assets/javascripts/nvd3/examples/images/grey-plus.png +0 -0
  87. data/vendor/assets/javascripts/nvd3/examples/indentedtree.html +126 -0
  88. data/vendor/assets/javascripts/nvd3/examples/legend.html +75 -0
  89. data/vendor/assets/javascripts/nvd3/examples/line.html +95 -0
  90. data/vendor/assets/javascripts/nvd3/examples/lineChart.html +112 -0
  91. data/vendor/assets/javascripts/nvd3/examples/lineChartSVGResize.html +151 -0
  92. data/vendor/assets/javascripts/nvd3/examples/linePlusBarChart.html +114 -0
  93. data/vendor/assets/javascripts/nvd3/examples/linePlusBarWithFocusChart.html +128 -0
  94. data/vendor/assets/javascripts/nvd3/examples/lineTimeSeries.html +142 -0
  95. data/vendor/assets/javascripts/nvd3/examples/lineWithFisheyeChart.html +101 -0
  96. data/vendor/assets/javascripts/nvd3/examples/lineWithFocusChart.html +87 -0
  97. data/vendor/assets/javascripts/nvd3/examples/multiBar.html +92 -0
  98. data/vendor/assets/javascripts/nvd3/examples/multiBarChart.html +93 -0
  99. data/vendor/assets/javascripts/nvd3/examples/multiBarHorizontalChart.html +388 -0
  100. data/vendor/assets/javascripts/nvd3/examples/multiChart.html +93 -0
  101. data/vendor/assets/javascripts/nvd3/examples/nations.json +1 -0
  102. data/vendor/assets/javascripts/nvd3/examples/pie.html +93 -0
  103. data/vendor/assets/javascripts/nvd3/examples/pieChart.html +114 -0
  104. data/vendor/assets/javascripts/nvd3/examples/scatter.html +95 -0
  105. data/vendor/assets/javascripts/nvd3/examples/scatterChart.html +115 -0
  106. data/vendor/assets/javascripts/nvd3/examples/scatterPlusLineChart.html +116 -0
  107. data/vendor/assets/javascripts/nvd3/examples/sparkline.html +62 -0
  108. data/vendor/assets/javascripts/nvd3/examples/sparklinePlus.html +67 -0
  109. data/vendor/assets/javascripts/nvd3/examples/stackedArea.html +155 -0
  110. data/vendor/assets/javascripts/nvd3/examples/stackedAreaChart.html +245 -0
  111. data/vendor/assets/javascripts/nvd3/examples/stream_layers.js +35 -0
  112. data/vendor/assets/javascripts/nvd3/lib/cie.js +155 -0
  113. data/vendor/assets/javascripts/nvd3/lib/crossfilter.js +1180 -0
  114. data/vendor/assets/javascripts/nvd3/lib/crossfilter.min.js +1 -0
  115. data/vendor/assets/javascripts/nvd3/lib/d3.v2.js +7033 -0
  116. data/vendor/assets/javascripts/nvd3/lib/d3.v2.min.js +4 -0
  117. data/vendor/assets/javascripts/nvd3/lib/fisheye.js +86 -0
  118. data/vendor/assets/javascripts/nvd3/lib/hive.js +80 -0
  119. data/vendor/assets/javascripts/nvd3/lib/horizon.js +192 -0
  120. data/vendor/assets/javascripts/nvd3/lib/sankey.js +292 -0
  121. data/vendor/assets/javascripts/nvd3/nv.d3.js +11762 -0
  122. data/vendor/assets/javascripts/nvd3/src/core.js +117 -0
  123. data/vendor/assets/javascripts/nvd3/src/models/axis.js +398 -0
  124. data/vendor/assets/javascripts/nvd3/src/models/backup/bullet.js +250 -0
  125. data/vendor/assets/javascripts/nvd3/src/models/backup/bulletChart.js +349 -0
  126. data/vendor/assets/javascripts/nvd3/src/models/bullet.js +377 -0
  127. data/vendor/assets/javascripts/nvd3/src/models/bulletChart.js +341 -0
  128. data/vendor/assets/javascripts/nvd3/src/models/cumulativeLineChart.js +609 -0
  129. data/vendor/assets/javascripts/nvd3/src/models/discreteBar.js +327 -0
  130. data/vendor/assets/javascripts/nvd3/src/models/discreteBarChart.js +290 -0
  131. data/vendor/assets/javascripts/nvd3/src/models/distribution.js +146 -0
  132. data/vendor/assets/javascripts/nvd3/src/models/historicalBar.js +289 -0
  133. data/vendor/assets/javascripts/nvd3/src/models/indentedTree.js +306 -0
  134. data/vendor/assets/javascripts/nvd3/src/models/legend.js +203 -0
  135. data/vendor/assets/javascripts/nvd3/src/models/line.js +286 -0
  136. data/vendor/assets/javascripts/nvd3/src/models/lineChart.js +359 -0
  137. data/vendor/assets/javascripts/nvd3/src/models/lineDynTimeSeriesChart.js +434 -0
  138. data/vendor/assets/javascripts/nvd3/src/models/linePlusBarChart.js +422 -0
  139. data/vendor/assets/javascripts/nvd3/src/models/linePlusBarWithFocusChart.js +657 -0
  140. data/vendor/assets/javascripts/nvd3/src/models/lineTimeSeriesChart.js +340 -0
  141. data/vendor/assets/javascripts/nvd3/src/models/lineWithFisheye.js +197 -0
  142. data/vendor/assets/javascripts/nvd3/src/models/lineWithFisheyeChart.js +324 -0
  143. data/vendor/assets/javascripts/nvd3/src/models/lineWithFocusChart.js +565 -0
  144. data/vendor/assets/javascripts/nvd3/src/models/multiAxisLineChart.js +312 -0
  145. data/vendor/assets/javascripts/nvd3/src/models/multiBar.js +416 -0
  146. data/vendor/assets/javascripts/nvd3/src/models/multiBarChart.js +445 -0
  147. data/vendor/assets/javascripts/nvd3/src/models/multiBarHorizontal.js +420 -0
  148. data/vendor/assets/javascripts/nvd3/src/models/multiBarHorizontalChart.js +415 -0
  149. data/vendor/assets/javascripts/nvd3/src/models/multiBarTimeSeries.js +371 -0
  150. data/vendor/assets/javascripts/nvd3/src/models/multiBarTimeSeriesChart.js +403 -0
  151. data/vendor/assets/javascripts/nvd3/src/models/multiChart.js +444 -0
  152. data/vendor/assets/javascripts/nvd3/src/models/ohlcBar.js +365 -0
  153. data/vendor/assets/javascripts/nvd3/src/models/pie.js +358 -0
  154. data/vendor/assets/javascripts/nvd3/src/models/pieChart.js +281 -0
  155. data/vendor/assets/javascripts/nvd3/src/models/scatter.js +622 -0
  156. data/vendor/assets/javascripts/nvd3/src/models/scatterChart.js +576 -0
  157. data/vendor/assets/javascripts/nvd3/src/models/scatterPlusLineChart.js +577 -0
  158. data/vendor/assets/javascripts/nvd3/src/models/sparkline.js +179 -0
  159. data/vendor/assets/javascripts/nvd3/src/models/sparklinePlus.js +291 -0
  160. data/vendor/assets/javascripts/nvd3/src/models/stackedArea.js +336 -0
  161. data/vendor/assets/javascripts/nvd3/src/models/stackedAreaChart.js +453 -0
  162. data/vendor/assets/javascripts/nvd3/src/nv.d3.css +671 -0
  163. data/vendor/assets/javascripts/nvd3/src/tooltip.js +129 -0
  164. data/vendor/assets/javascripts/nvd3/src/utils.js +105 -0
  165. data/vendor/assets/javascripts/set-nvd3-env.js.erb +5 -0
  166. data/vendor/assets/stylesheets/nvd3-rails.css +3 -0
  167. metadata +233 -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(); selection.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
+ }