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,445 @@
1
+
2
+ nv.models.multiBarChart = function() {
3
+
4
+ //============================================================
5
+ // Public Variables with Default Settings
6
+ //------------------------------------------------------------
7
+
8
+ var multibar = nv.models.multiBar()
9
+ , xAxis = nv.models.axis()
10
+ , yAxis = nv.models.axis()
11
+ , legend = nv.models.legend()
12
+ , controls = nv.models.legend()
13
+ ;
14
+
15
+ var margin = {top: 30, right: 20, bottom: 30, left: 60}
16
+ , width = null
17
+ , height = null
18
+ , color = nv.utils.defaultColor()
19
+ , showControls = true
20
+ , showLegend = true
21
+ , reduceXTicks = true // if false a tick will show for every data point
22
+ , rotateLabels = 0
23
+ , tooltips = true
24
+ , tooltip = function(key, x, y, e, graph) {
25
+ return '<h3>' + key + '</h3>' +
26
+ '<p>' + y + ' on ' + x + '</p>'
27
+ }
28
+ , x //can be accessed via chart.xScale()
29
+ , y //can be accessed via chart.yScale()
30
+ , state = { stacked: false }
31
+ , noData = "No Data Available."
32
+ , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState')
33
+ ;
34
+
35
+ multibar
36
+ .stacked(false)
37
+ ;
38
+ xAxis
39
+ .orient('bottom')
40
+ .tickPadding(7)
41
+ .highlightZero(false)
42
+ .showMaxMin(false)
43
+ .tickFormat(function(d) { return d })
44
+ ;
45
+ yAxis
46
+ .orient('left')
47
+ .tickFormat(d3.format(',.1f'))
48
+ ;
49
+
50
+ //============================================================
51
+
52
+
53
+ //============================================================
54
+ // Private Variables
55
+ //------------------------------------------------------------
56
+
57
+ var showTooltip = function(e, offsetElement) {
58
+ var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ),
59
+ top = e.pos[1] + ( offsetElement.offsetTop || 0),
60
+ x = xAxis.tickFormat()(multibar.x()(e.point, e.pointIndex)),
61
+ y = yAxis.tickFormat()(multibar.y()(e.point, e.pointIndex)),
62
+ content = tooltip(e.series.key, x, y, e, chart);
63
+
64
+ nv.tooltip.show([left, top], content, e.value < 0 ? 'n' : 's', null, offsetElement);
65
+ };
66
+
67
+ //============================================================
68
+
69
+
70
+ function chart(selection) {
71
+ selection.each(function(data) {
72
+ var container = d3.select(this),
73
+ that = this;
74
+
75
+ var availableWidth = (width || parseInt(container.style('width')) || 960)
76
+ - margin.left - margin.right,
77
+ availableHeight = (height || parseInt(container.style('height')) || 400)
78
+ - margin.top - margin.bottom;
79
+
80
+ chart.update = function() { selection.transition().call(chart) };
81
+ chart.container = this;
82
+
83
+
84
+ //------------------------------------------------------------
85
+ // Display noData message if there's nothing to show.
86
+
87
+ if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {
88
+ var noDataText = container.selectAll('.nv-noData').data([noData]);
89
+
90
+ noDataText.enter().append('text')
91
+ .attr('class', 'nvd3 nv-noData')
92
+ .attr('dy', '-.7em')
93
+ .style('text-anchor', 'middle');
94
+
95
+ noDataText
96
+ .attr('x', margin.left + availableWidth / 2)
97
+ .attr('y', margin.top + availableHeight / 2)
98
+ .text(function(d) { return d });
99
+
100
+ return chart;
101
+ } else {
102
+ container.selectAll('.nv-noData').remove();
103
+ }
104
+
105
+ //------------------------------------------------------------
106
+
107
+
108
+ //------------------------------------------------------------
109
+ // Setup Scales
110
+
111
+ x = multibar.xScale();
112
+ y = multibar.yScale();
113
+
114
+ //------------------------------------------------------------
115
+
116
+
117
+ //------------------------------------------------------------
118
+ // Setup containers and skeleton of chart
119
+
120
+ var wrap = container.selectAll('g.nv-wrap.nv-multiBarWithLegend').data([data]);
121
+ var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multiBarWithLegend').append('g');
122
+ var g = wrap.select('g');
123
+
124
+ gEnter.append('g').attr('class', 'nv-x nv-axis');
125
+ gEnter.append('g').attr('class', 'nv-y nv-axis');
126
+ gEnter.append('g').attr('class', 'nv-barsWrap');
127
+ gEnter.append('g').attr('class', 'nv-legendWrap');
128
+ gEnter.append('g').attr('class', 'nv-controlsWrap');
129
+
130
+ //------------------------------------------------------------
131
+
132
+
133
+ //------------------------------------------------------------
134
+ // Legend
135
+
136
+ if (showLegend) {
137
+ legend.width(availableWidth / 2);
138
+
139
+ if (multibar.barColor())
140
+ data.forEach(function(series,i) {
141
+ series.color = d3.rgb('#ccc').darker(i * 1.5).toString();
142
+ })
143
+
144
+ g.select('.nv-legendWrap')
145
+ .datum(data)
146
+ .call(legend);
147
+
148
+ if ( margin.top != legend.height()) {
149
+ margin.top = legend.height();
150
+ availableHeight = (height || parseInt(container.style('height')) || 400)
151
+ - margin.top - margin.bottom;
152
+ }
153
+
154
+ g.select('.nv-legendWrap')
155
+ .attr('transform', 'translate(' + (availableWidth / 2) + ',' + (-margin.top) +')');
156
+ }
157
+
158
+ //------------------------------------------------------------
159
+
160
+
161
+ //------------------------------------------------------------
162
+ // Controls
163
+
164
+ if (showControls) {
165
+ var controlsData = [
166
+ { key: 'Grouped', disabled: multibar.stacked() },
167
+ { key: 'Stacked', disabled: !multibar.stacked() }
168
+ ];
169
+
170
+ controls.width(180).color(['#444', '#444', '#444']);
171
+ g.select('.nv-controlsWrap')
172
+ .datum(controlsData)
173
+ .attr('transform', 'translate(0,' + (-margin.top) +')')
174
+ .call(controls);
175
+ }
176
+
177
+ //------------------------------------------------------------
178
+
179
+
180
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
181
+
182
+
183
+ //------------------------------------------------------------
184
+ // Main Chart Component(s)
185
+
186
+ multibar
187
+ .disabled(data.map(function(series) { return series.disabled }))
188
+ .width(availableWidth)
189
+ .height(availableHeight)
190
+ .color(data.map(function(d,i) {
191
+ return d.color || color(d, i);
192
+ }).filter(function(d,i) { return !data[i].disabled }))
193
+
194
+
195
+ var barsWrap = g.select('.nv-barsWrap')
196
+ .datum(data.filter(function(d) { return !d.disabled }))
197
+
198
+ d3.transition(barsWrap).call(multibar);
199
+
200
+ //------------------------------------------------------------
201
+
202
+
203
+ //------------------------------------------------------------
204
+ // Setup Axes
205
+
206
+ xAxis
207
+ .scale(x)
208
+ .ticks( availableWidth / 100 )
209
+ .tickSize(-availableHeight, 0);
210
+
211
+ g.select('.nv-x.nv-axis')
212
+ .attr('transform', 'translate(0,' + y.range()[0] + ')');
213
+ d3.transition(g.select('.nv-x.nv-axis'))
214
+ .call(xAxis);
215
+
216
+ var xTicks = g.select('.nv-x.nv-axis > g').selectAll('g');
217
+
218
+ xTicks
219
+ .selectAll('line, text')
220
+ .style('opacity', 1)
221
+
222
+ if (reduceXTicks)
223
+ xTicks
224
+ .filter(function(d,i) {
225
+ return i % Math.ceil(data[0].values.length / (availableWidth / 100)) !== 0;
226
+ })
227
+ .selectAll('text, line')
228
+ .style('opacity', 0);
229
+
230
+ if(rotateLabels)
231
+ xTicks
232
+ .selectAll('text')
233
+ .attr('transform', 'rotate(' + rotateLabels + ' 0,0)')
234
+ .attr('text-anchor', rotateLabels > 0 ? 'start' : 'end');
235
+
236
+ g.select('.nv-x.nv-axis').selectAll('g.nv-axisMaxMin text')
237
+ .style('opacity', 1);
238
+
239
+ yAxis
240
+ .scale(y)
241
+ .ticks( availableHeight / 36 )
242
+ .tickSize( -availableWidth, 0);
243
+
244
+ d3.transition(g.select('.nv-y.nv-axis'))
245
+ .call(yAxis);
246
+
247
+ //------------------------------------------------------------
248
+
249
+
250
+
251
+ //============================================================
252
+ // Event Handling/Dispatching (in chart's scope)
253
+ //------------------------------------------------------------
254
+
255
+ legend.dispatch.on('legendClick', function(d,i) {
256
+ d.disabled = !d.disabled;
257
+
258
+ if (!data.filter(function(d) { return !d.disabled }).length) {
259
+ data.map(function(d) {
260
+ d.disabled = false;
261
+ wrap.selectAll('.nv-series').classed('disabled', false);
262
+ return d;
263
+ });
264
+ }
265
+
266
+ state.disabled = data.map(function(d) { return !!d.disabled });
267
+ dispatch.stateChange(state);
268
+
269
+ selection.transition().call(chart);
270
+ });
271
+
272
+ controls.dispatch.on('legendClick', function(d,i) {
273
+ if (!d.disabled) return;
274
+ controlsData = controlsData.map(function(s) {
275
+ s.disabled = true;
276
+ return s;
277
+ });
278
+ d.disabled = false;
279
+
280
+ switch (d.key) {
281
+ case 'Grouped':
282
+ multibar.stacked(false);
283
+ break;
284
+ case 'Stacked':
285
+ multibar.stacked(true);
286
+ break;
287
+ }
288
+
289
+ state.stacked = multibar.stacked();
290
+ dispatch.stateChange(state);
291
+
292
+ selection.transition().call(chart);
293
+ });
294
+
295
+ dispatch.on('tooltipShow', function(e) {
296
+ if (tooltips) showTooltip(e, that.parentNode)
297
+ });
298
+
299
+ // Update chart from a state object passed to event handler
300
+ dispatch.on('changeState', function(e) {
301
+
302
+ if (typeof e.disabled !== 'undefined') {
303
+ data.forEach(function(series,i) {
304
+ series.disabled = e.disabled[i];
305
+ });
306
+
307
+ state.disabled = e.disabled;
308
+ }
309
+
310
+ if (typeof e.stacked !== 'undefined') {
311
+ multibar.stacked(e.stacked);
312
+ state.stacked = e.stacked;
313
+ }
314
+
315
+ selection.call(chart);
316
+ });
317
+
318
+ //============================================================
319
+
320
+
321
+ });
322
+
323
+ return chart;
324
+ }
325
+
326
+
327
+ //============================================================
328
+ // Event Handling/Dispatching (out of chart's scope)
329
+ //------------------------------------------------------------
330
+
331
+ multibar.dispatch.on('elementMouseover.tooltip', function(e) {
332
+ e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top];
333
+ dispatch.tooltipShow(e);
334
+ });
335
+
336
+ multibar.dispatch.on('elementMouseout.tooltip', function(e) {
337
+ dispatch.tooltipHide(e);
338
+ });
339
+ dispatch.on('tooltipHide', function() {
340
+ if (tooltips) nv.tooltip.cleanup();
341
+ });
342
+
343
+ //============================================================
344
+
345
+
346
+ //============================================================
347
+ // Expose Public Variables
348
+ //------------------------------------------------------------
349
+
350
+ // expose chart's sub-components
351
+ chart.dispatch = dispatch;
352
+ chart.multibar = multibar;
353
+ chart.legend = legend;
354
+ chart.xAxis = xAxis;
355
+ chart.yAxis = yAxis;
356
+
357
+ d3.rebind(chart, multibar, 'x', 'y', 'xDomain', 'yDomain', 'forceX', 'forceY', 'clipEdge', 'id', 'stacked', 'delay', 'barColor');
358
+
359
+ chart.margin = function(_) {
360
+ if (!arguments.length) return margin;
361
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
362
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
363
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
364
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
365
+ return chart;
366
+ };
367
+
368
+ chart.width = function(_) {
369
+ if (!arguments.length) return width;
370
+ width = _;
371
+ return chart;
372
+ };
373
+
374
+ chart.height = function(_) {
375
+ if (!arguments.length) return height;
376
+ height = _;
377
+ return chart;
378
+ };
379
+
380
+ chart.color = function(_) {
381
+ if (!arguments.length) return color;
382
+ color = nv.utils.getColor(_);
383
+ legend.color(color);
384
+ return chart;
385
+ };
386
+
387
+ chart.showControls = function(_) {
388
+ if (!arguments.length) return showControls;
389
+ showControls = _;
390
+ return chart;
391
+ };
392
+
393
+ chart.showLegend = function(_) {
394
+ if (!arguments.length) return showLegend;
395
+ showLegend = _;
396
+ return chart;
397
+ };
398
+
399
+ chart.reduceXTicks= function(_) {
400
+ if (!arguments.length) return reduceXTicks;
401
+ reduceXTicks = _;
402
+ return chart;
403
+ };
404
+
405
+ chart.rotateLabels = function(_) {
406
+ if (!arguments.length) return rotateLabels;
407
+ rotateLabels = _;
408
+ return chart;
409
+ }
410
+
411
+ chart.tooltip = function(_) {
412
+ if (!arguments.length) return tooltip;
413
+ tooltip = _;
414
+ return chart;
415
+ };
416
+
417
+ chart.tooltips = function(_) {
418
+ if (!arguments.length) return tooltips;
419
+ tooltips = _;
420
+ return chart;
421
+ };
422
+
423
+ chart.tooltipContent = function(_) {
424
+ if (!arguments.length) return tooltip;
425
+ tooltip = _;
426
+ return chart;
427
+ };
428
+
429
+ chart.state = function(_) {
430
+ if (!arguments.length) return state;
431
+ state = _;
432
+ return chart;
433
+ };
434
+
435
+ chart.noData = function(_) {
436
+ if (!arguments.length) return noData;
437
+ noData = _;
438
+ return chart;
439
+ };
440
+
441
+ //============================================================
442
+
443
+
444
+ return chart;
445
+ }
@@ -0,0 +1,420 @@
1
+
2
+ nv.models.multiBarHorizontal = 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
+ , barColor = null // adding the ability to set the color for each rather than the whole group
19
+ , disabled // used in conjunction with barColor to communicate from multiBarHorizontalChart what series are disabled
20
+ , stacked = false
21
+ , showValues = false
22
+ , valuePadding = 60
23
+ , valueFormat = d3.format(',.2f')
24
+ , delay = 1200
25
+ , xDomain
26
+ , yDomain
27
+ , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout')
28
+ ;
29
+
30
+ //============================================================
31
+
32
+
33
+ //============================================================
34
+ // Private Variables
35
+ //------------------------------------------------------------
36
+
37
+ var x0, y0 //used to store previous scales
38
+ ;
39
+
40
+ //============================================================
41
+
42
+
43
+ function chart(selection) {
44
+ selection.each(function(data) {
45
+ var availableWidth = width - margin.left - margin.right,
46
+ availableHeight = height - margin.top - margin.bottom,
47
+ container = d3.select(this);
48
+
49
+
50
+ if (stacked)
51
+ data = d3.layout.stack()
52
+ .offset('zero')
53
+ .values(function(d){ return d.values })
54
+ .y(getY)
55
+ (data);
56
+
57
+
58
+ //add series index to each data point for reference
59
+ data = data.map(function(series, i) {
60
+ series.values = series.values.map(function(point) {
61
+ point.series = i;
62
+ return point;
63
+ });
64
+ return series;
65
+ });
66
+
67
+
68
+
69
+ //------------------------------------------------------------
70
+ // HACK for negative value stacking
71
+ if (stacked)
72
+ data[0].values.map(function(d,i) {
73
+ var posBase = 0, negBase = 0;
74
+ data.map(function(d) {
75
+ var f = d.values[i]
76
+ f.size = Math.abs(f.y);
77
+ if (f.y<0) {
78
+ f.y1 = negBase - f.size;
79
+ negBase = negBase - f.size;
80
+ } else
81
+ {
82
+ f.y1 = posBase;
83
+ posBase = posBase + f.size;
84
+ }
85
+ });
86
+ });
87
+
88
+
89
+
90
+ //------------------------------------------------------------
91
+ // Setup Scales
92
+
93
+ // remap and flatten the data for use in calculating the scales' domains
94
+ var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate
95
+ data.map(function(d) {
96
+ return d.values.map(function(d,i) {
97
+ return { x: getX(d,i), y: getY(d,i), y0: d.y0, y1: d.y1 }
98
+ })
99
+ });
100
+
101
+ x .domain(xDomain || d3.merge(seriesData).map(function(d) { return d.x }))
102
+ .rangeBands([0, availableHeight], .1);
103
+
104
+ //y .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return d.y + (stacked ? d.y0 : 0) }).concat(forceY)))
105
+ y .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return stacked ? (d.y > 0 ? d.y1 + d.y : d.y1 ) : d.y }).concat(forceY)))
106
+
107
+ if (showValues && !stacked)
108
+ y.range([(y.domain()[0] < 0 ? valuePadding : 0), availableWidth - (y.domain()[1] > 0 ? valuePadding : 0) ]);
109
+ else
110
+ y.range([0, availableWidth]);
111
+
112
+ x0 = x0 || x;
113
+ y0 = y0 || d3.scale.linear().domain(y.domain()).range([y(0),y(0)]);
114
+
115
+ //------------------------------------------------------------
116
+
117
+
118
+ //------------------------------------------------------------
119
+ // Setup containers and skeleton of chart
120
+
121
+ var wrap = d3.select(this).selectAll('g.nv-wrap.nv-multibarHorizontal').data([data]);
122
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multibarHorizontal');
123
+ var defsEnter = wrapEnter.append('defs');
124
+ var gEnter = wrapEnter.append('g');
125
+ var g = wrap.select('g');
126
+
127
+ gEnter.append('g').attr('class', 'nv-groups');
128
+
129
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
130
+
131
+ //------------------------------------------------------------
132
+
133
+
134
+
135
+ var groups = wrap.select('.nv-groups').selectAll('.nv-group')
136
+ .data(function(d) { return d }, function(d) { return d.key });
137
+ groups.enter().append('g')
138
+ .style('stroke-opacity', 1e-6)
139
+ .style('fill-opacity', 1e-6);
140
+ d3.transition(groups.exit())
141
+ .style('stroke-opacity', 1e-6)
142
+ .style('fill-opacity', 1e-6)
143
+ .remove();
144
+ groups
145
+ .attr('class', function(d,i) { return 'nv-group nv-series-' + i })
146
+ .classed('hover', function(d) { return d.hover })
147
+ .style('fill', function(d,i){ return color(d, i) })
148
+ .style('stroke', function(d,i){ return color(d, i) });
149
+ d3.transition(groups)
150
+ .style('stroke-opacity', 1)
151
+ .style('fill-opacity', .75);
152
+
153
+
154
+ var bars = groups.selectAll('g.nv-bar')
155
+ .data(function(d) { return d.values });
156
+
157
+ bars.exit().remove();
158
+
159
+
160
+ var barsEnter = bars.enter().append('g')
161
+ .attr('transform', function(d,i,j) {
162
+ return 'translate(' + y0(stacked ? d.y0 : 0) + ',' + (stacked ? 0 : (j * x.rangeBand() / data.length ) + x(getX(d,i))) + ')'
163
+ });
164
+
165
+ barsEnter.append('rect')
166
+ .attr('width', 0)
167
+ .attr('height', x.rangeBand() / (stacked ? 1 : data.length) )
168
+
169
+ bars
170
+ .on('mouseover', function(d,i) { //TODO: figure out why j works above, but not here
171
+ d3.select(this).classed('hover', true);
172
+ dispatch.elementMouseover({
173
+ value: getY(d,i),
174
+ point: d,
175
+ series: data[d.series],
176
+ pos: [ y(getY(d,i) + (stacked ? d.y0 : 0)), x(getX(d,i)) + (x.rangeBand() * (stacked ? data.length / 2 : d.series + .5) / data.length) ],
177
+ pointIndex: i,
178
+ seriesIndex: d.series,
179
+ e: d3.event
180
+ });
181
+ })
182
+ .on('mouseout', function(d,i) {
183
+ d3.select(this).classed('hover', false);
184
+ dispatch.elementMouseout({
185
+ value: getY(d,i),
186
+ point: d,
187
+ series: data[d.series],
188
+ pointIndex: i,
189
+ seriesIndex: d.series,
190
+ e: d3.event
191
+ });
192
+ })
193
+ .on('click', function(d,i) {
194
+ dispatch.elementClick({
195
+ value: getY(d,i),
196
+ point: d,
197
+ series: data[d.series],
198
+ pos: [x(getX(d,i)) + (x.rangeBand() * (stacked ? data.length / 2 : d.series + .5) / data.length), y(getY(d,i) + (stacked ? d.y0 : 0))], // TODO: Figure out why the value appears to be shifted
199
+ pointIndex: i,
200
+ seriesIndex: d.series,
201
+ e: d3.event
202
+ });
203
+ d3.event.stopPropagation();
204
+ })
205
+ .on('dblclick', function(d,i) {
206
+ dispatch.elementDblClick({
207
+ value: getY(d,i),
208
+ point: d,
209
+ series: data[d.series],
210
+ pos: [x(getX(d,i)) + (x.rangeBand() * (stacked ? data.length / 2 : d.series + .5) / data.length), y(getY(d,i) + (stacked ? d.y0 : 0))], // TODO: Figure out why the value appears to be shifted
211
+ pointIndex: i,
212
+ seriesIndex: d.series,
213
+ e: d3.event
214
+ });
215
+ d3.event.stopPropagation();
216
+ });
217
+
218
+
219
+ barsEnter.append('text');
220
+
221
+ if (showValues && !stacked) {
222
+ bars.select('text')
223
+ .attr('text-anchor', function(d,i) { return getY(d,i) < 0 ? 'end' : 'start' })
224
+ .attr('y', x.rangeBand() / (data.length * 2))
225
+ .attr('dy', '.32em')
226
+ .text(function(d,i) { return valueFormat(getY(d,i)) })
227
+ d3.transition(bars)
228
+ //.delay(function(d,i) { return i * delay / data[0].values.length })
229
+ .select('text')
230
+ .attr('x', function(d,i) { return getY(d,i) < 0 ? -4 : y(getY(d,i)) - y(0) + 4 })
231
+ } else {
232
+ //bars.selectAll('text').remove();
233
+ bars.selectAll('text').text('');
234
+ }
235
+
236
+ bars
237
+ .attr('class', function(d,i) { return getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive'})
238
+
239
+ if (barColor) {
240
+ if (!disabled) disabled = data.map(function() { return true });
241
+ bars
242
+ //.style('fill', barColor)
243
+ //.style('stroke', barColor)
244
+ //.style('fill', function(d,i,j) { return d3.rgb(barColor(d,i)).darker(j).toString(); })
245
+ //.style('stroke', function(d,i,j) { return d3.rgb(barColor(d,i)).darker(j).toString(); })
246
+ .style('fill', function(d,i,j) { return d3.rgb(barColor(d,i)).darker( disabled.map(function(d,i) { return i }).filter(function(d,i){ return !disabled[i] })[j] ).toString(); })
247
+ .style('stroke', function(d,i,j) { return d3.rgb(barColor(d,i)).darker( disabled.map(function(d,i) { return i }).filter(function(d,i){ return !disabled[i] })[j] ).toString(); });
248
+ }
249
+
250
+ if (stacked)
251
+ d3.transition(bars)
252
+ //.delay(function(d,i) { return i * delay / data[0].values.length })
253
+ .attr('transform', function(d,i) {
254
+ //return 'translate(' + y(d.y0) + ',0)'
255
+ //return 'translate(' + y(d.y0) + ',' + x(getX(d,i)) + ')'
256
+ return 'translate(' + y(d.y1) + ',' + x(getX(d,i)) + ')'
257
+ })
258
+ .select('rect')
259
+ .attr('width', function(d,i) {
260
+ return Math.abs(y(getY(d,i) + d.y0) - y(d.y0))
261
+ })
262
+ .attr('height', x.rangeBand() );
263
+ else
264
+ d3.transition(bars)
265
+ //.delay(function(d,i) { return i * delay / data[0].values.length })
266
+ .attr('transform', function(d,i) {
267
+ //TODO: stacked must be all positive or all negative, not both?
268
+ return 'translate(' +
269
+ (getY(d,i) < 0 ? y(getY(d,i)) : y(0))
270
+ + ',' +
271
+ (d.series * x.rangeBand() / data.length
272
+ +
273
+ x(getX(d,i)) )
274
+ + ')'
275
+ })
276
+ .select('rect')
277
+ .attr('height', x.rangeBand() / data.length )
278
+ .attr('width', function(d,i) {
279
+ return Math.max(Math.abs(y(getY(d,i)) - y(0)),1)
280
+ });
281
+
282
+
283
+ //store old scales for use in transitions on update
284
+ x0 = x.copy();
285
+ y0 = y.copy();
286
+
287
+ });
288
+
289
+ return chart;
290
+ }
291
+
292
+
293
+ //============================================================
294
+ // Expose Public Variables
295
+ //------------------------------------------------------------
296
+
297
+ chart.dispatch = dispatch;
298
+
299
+ chart.x = function(_) {
300
+ if (!arguments.length) return getX;
301
+ getX = _;
302
+ return chart;
303
+ };
304
+
305
+ chart.y = function(_) {
306
+ if (!arguments.length) return getY;
307
+ getY = _;
308
+ return chart;
309
+ };
310
+
311
+ chart.margin = function(_) {
312
+ if (!arguments.length) return margin;
313
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
314
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
315
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
316
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
317
+ return chart;
318
+ };
319
+
320
+ chart.width = function(_) {
321
+ if (!arguments.length) return width;
322
+ width = _;
323
+ return chart;
324
+ };
325
+
326
+ chart.height = function(_) {
327
+ if (!arguments.length) return height;
328
+ height = _;
329
+ return chart;
330
+ };
331
+
332
+ chart.xScale = function(_) {
333
+ if (!arguments.length) return x;
334
+ x = _;
335
+ return chart;
336
+ };
337
+
338
+ chart.yScale = function(_) {
339
+ if (!arguments.length) return y;
340
+ y = _;
341
+ return chart;
342
+ };
343
+
344
+ chart.xDomain = function(_) {
345
+ if (!arguments.length) return xDomain;
346
+ xDomain = _;
347
+ return chart;
348
+ };
349
+
350
+ chart.yDomain = function(_) {
351
+ if (!arguments.length) return yDomain;
352
+ yDomain = _;
353
+ return chart;
354
+ };
355
+
356
+ chart.forceY = function(_) {
357
+ if (!arguments.length) return forceY;
358
+ forceY = _;
359
+ return chart;
360
+ };
361
+
362
+ chart.stacked = function(_) {
363
+ if (!arguments.length) return stacked;
364
+ stacked = _;
365
+ return chart;
366
+ };
367
+
368
+ chart.color = function(_) {
369
+ if (!arguments.length) return color;
370
+ color = nv.utils.getColor(_);
371
+ return chart;
372
+ };
373
+
374
+ chart.barColor = function(_) {
375
+ if (!arguments.length) return barColor;
376
+ barColor = nv.utils.getColor(_);
377
+ return chart;
378
+ };
379
+
380
+ chart.disabled = function(_) {
381
+ if (!arguments.length) return disabled;
382
+ disabled = _;
383
+ return chart;
384
+ };
385
+
386
+ chart.id = function(_) {
387
+ if (!arguments.length) return id;
388
+ id = _;
389
+ return chart;
390
+ };
391
+
392
+ chart.delay = function(_) {
393
+ if (!arguments.length) return delay;
394
+ delay = _;
395
+ return chart;
396
+ };
397
+
398
+ chart.showValues = function(_) {
399
+ if (!arguments.length) return showValues;
400
+ showValues = _;
401
+ return chart;
402
+ };
403
+
404
+ chart.valueFormat= function(_) {
405
+ if (!arguments.length) return valueFormat;
406
+ valueFormat = _;
407
+ return chart;
408
+ };
409
+
410
+ chart.valuePadding = function(_) {
411
+ if (!arguments.length) return valuePadding;
412
+ valuePadding = _;
413
+ return chart;
414
+ };
415
+
416
+ //============================================================
417
+
418
+
419
+ return chart;
420
+ }