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,261 @@
1
+
2
+ nv.models.scatterWithLegend = function() {
3
+ var margin = {top: 30, right: 20, bottom: 50, left: 60},
4
+ width = function() { return 960 }, //TODO: should probably make this consistent... or maybe constant in the models, closure in the charts
5
+ height = function() { return 500 },
6
+ xAxisLabelText = false,
7
+ yAxisLabelText = false,
8
+ showDistX = false,
9
+ showDistY = false,
10
+ color = d3.scale.category20().range();
11
+
12
+ var xAxis = nv.models.axis().orient('bottom').tickPadding(10),
13
+ yAxis = nv.models.axis().orient('left').tickPadding(10),
14
+ legend = nv.models.legend().height(30),
15
+ scatter = nv.models.scatter(),
16
+ dispatch = d3.dispatch('tooltipShow', 'tooltipHide'),
17
+ x, y, x0, y0;
18
+
19
+
20
+ function chart(selection) {
21
+ selection.each(function(data) {
22
+ var availableWidth = width() - margin.left - margin.right,
23
+ availableHeight = height() - margin.top - margin.bottom;
24
+
25
+ x0 = x0 || scatter.xScale();
26
+ y0 = y0 || scatter.yScale();
27
+
28
+
29
+
30
+ var wrap = d3.select(this).selectAll('g.wrap.scatterWithLegend').data([data]);
31
+ var gEnter = wrap.enter().append('g').attr('class', 'wrap nvd3 scatterWithLegend').append('g');
32
+
33
+ gEnter.append('g').attr('class', 'legendWrap');
34
+ gEnter.append('g').attr('class', 'x axis');
35
+ gEnter.append('g').attr('class', 'y axis');
36
+ gEnter.append('g').attr('class', 'scatterWrap');
37
+ //gEnter.append('g').attr('class', 'distWrap');
38
+
39
+
40
+
41
+ scatter
42
+ .width(availableWidth)
43
+ .height(availableHeight)
44
+ //.xDomain(x.domain())
45
+ //.yDomain(y.domain())
46
+ .color(data.map(function(d,i) {
47
+ return d.color || color[i % 20];
48
+ }).filter(function(d,i) { return !data[i].disabled }))
49
+
50
+ var scatterWrap = wrap.select('.scatterWrap')
51
+ .datum(data.filter(function(d) { return !d.disabled }));
52
+
53
+ d3.transition(scatterWrap).call(scatter);
54
+
55
+
56
+ x = scatter.xScale();
57
+ y = scatter.yScale();
58
+
59
+ xAxis.scale(x);
60
+ yAxis.scale(y);
61
+
62
+
63
+ //TODO: margins should be adjusted based on what components are used: axes, axis labels, legend
64
+ //TODO: Fix height issue on first render if legend height is larger than margin.top, NEED TO FIX EVERY MODEL WITH A LEGEND
65
+ margin.top = legend.height();
66
+
67
+ var g = wrap.select('g')
68
+ .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
69
+
70
+
71
+ legend.width(availableWidth / 2);
72
+
73
+ wrap.select('.legendWrap')
74
+ .datum(data)
75
+ .attr('transform', 'translate(' + (availableWidth / 2) + ',' + (-margin.top) +')')
76
+ .call(legend);
77
+
78
+
79
+
80
+
81
+ if ( showDistX || showDistY) {
82
+ var distWrap = scatterWrap.selectAll('g.distribution')
83
+ .data(function(d) { return d }, function(d) { return d.key });
84
+
85
+ distWrap.enter().append('g').attr('class', function(d,i) { return 'distribution series-' + i })
86
+
87
+ distWrap.style('stroke', function(d,i) { return color.filter(function(d,i) { return data[i] && !data[i].disabled })[i % 10] })
88
+ }
89
+
90
+ if (showDistX) {
91
+ var distX = distWrap.selectAll('line.distX')
92
+ .data(function(d) { return d.values })
93
+ distX.enter().append('line')
94
+ .attr('x1', function(d,i) { return x0(scatter.x()(d,i)) })
95
+ .attr('x2', function(d,i) { return x0(scatter.x()(d,i)) })
96
+ //d3.transition(distX.exit())
97
+ d3.transition(distWrap.exit().selectAll('line.distX'))
98
+ .attr('x1', function(d,i) { return x(scatter.x()(d,i)) })
99
+ .attr('x2', function(d,i) { return x(scatter.x()(d,i)) })
100
+ .remove();
101
+ distX
102
+ .attr('class', function(d,i) { return 'distX distX-' + i })
103
+ .attr('y1', y.range()[0])
104
+ .attr('y2', y.range()[0] + 8);
105
+ d3.transition(distX)
106
+ .attr('x1', function(d,i) { return x(scatter.x()(d,i)) })
107
+ .attr('x2', function(d,i) { return x(scatter.x()(d,i)) })
108
+ }
109
+
110
+
111
+ if (showDistY) {
112
+ var distY = distWrap.selectAll('line.distY')
113
+ .data(function(d) { return d.values })
114
+ distY.enter().append('line')
115
+ .attr('y1', function(d,i) { return y0(scatter.y()(d,i)) })
116
+ .attr('y2', function(d,i) { return y0(scatter.y()(d,i)) });
117
+ //d3.transition(distY.exit())
118
+ d3.transition(distWrap.exit().selectAll('line.distY'))
119
+ .attr('y1', function(d,i) { return y(scatter.y()(d,i)) })
120
+ .attr('y2', function(d,i) { return y(scatter.y()(d,i)) })
121
+ .remove();
122
+ distY
123
+ .attr('class', function(d,i) { return 'distY distY-' + i })
124
+ .attr('x1', x.range()[0])
125
+ .attr('x2', x.range()[0] - 8)
126
+ d3.transition(distY)
127
+ .attr('y1', function(d,i) { return y(scatter.y()(d,i)) }) .attr('y2', function(d,i) { return y(scatter.y()(d,i)) });
128
+ }
129
+
130
+
131
+ xAxis
132
+ .ticks( availableWidth / 100 )
133
+ .tickSize( -availableHeight , 0);
134
+
135
+ g.select('.x.axis')
136
+ .attr('transform', 'translate(0,' + y.range()[0] + ')');
137
+
138
+ d3.transition(g.select('.x.axis'))
139
+ .call(xAxis);
140
+
141
+
142
+ yAxis
143
+ .ticks( availableHeight / 36 )
144
+ .tickSize( -availableWidth, 0);
145
+
146
+ d3.transition(g.select('.y.axis'))
147
+ .call(yAxis);
148
+
149
+
150
+
151
+
152
+ legend.dispatch.on('legendClick', function(d,i, that) {
153
+ d.disabled = !d.disabled;
154
+
155
+ if (!data.filter(function(d) { return !d.disabled }).length) {
156
+ data.map(function(d) {
157
+ d.disabled = false;
158
+ wrap.selectAll('.series').classed('disabled', false);
159
+ return d;
160
+ });
161
+ }
162
+
163
+ selection.transition().call(chart)
164
+ });
165
+
166
+ /*
167
+ legend.dispatch.on('legendMouseover', function(d, i) {
168
+ d.hover = true;
169
+ selection.transition().call(chart)
170
+ });
171
+
172
+ legend.dispatch.on('legendMouseout', function(d, i) {
173
+ d.hover = false;
174
+ selection.transition().call(chart)
175
+ });
176
+ */
177
+
178
+
179
+ scatter.dispatch.on('elementMouseover.tooltip', function(e) {
180
+ dispatch.tooltipShow({
181
+ point: e.point,
182
+ series: e.series,
183
+ pos: [e.pos[0] + margin.left, e.pos[1] + margin.top],
184
+ seriesIndex: e.seriesIndex,
185
+ pointIndex: e.pointIndex
186
+ });
187
+
188
+ scatterWrap.select('.series-' + e.seriesIndex + ' .distX-' + e.pointIndex)
189
+ .attr('y1', e.pos[1]);
190
+ scatterWrap.select('.series-' + e.seriesIndex + ' .distY-' + e.pointIndex)
191
+ .attr('x1', e.pos[0]);
192
+ });
193
+
194
+ scatter.dispatch.on('elementMouseout.tooltip', function(e) {
195
+ dispatch.tooltipHide(e);
196
+
197
+ scatterWrap.select('.series-' + e.seriesIndex + ' .distX-' + e.pointIndex)
198
+ .attr('y1', y.range()[0]);
199
+ scatterWrap.select('.series-' + e.seriesIndex + ' .distY-' + e.pointIndex)
200
+ .attr('x1', x.range()[0]);
201
+ });
202
+
203
+
204
+ //store old scales for use in transitions on update, to animate from old to new positions, and sizes
205
+ x0 = x.copy();
206
+ y0 = y.copy();
207
+
208
+ });
209
+
210
+ return chart;
211
+ }
212
+
213
+
214
+ chart.dispatch = dispatch;
215
+ chart.legend = legend;
216
+ chart.xAxis = xAxis;
217
+ chart.yAxis = yAxis;
218
+
219
+ d3.rebind(chart, scatter, 'interactive', 'size', 'xScale', 'yScale', 'zScale', 'xDomain', 'yDomain', 'sizeDomain', 'forceX', 'forceY', 'forceSize', 'clipVoronoi', 'clipRadius');
220
+
221
+
222
+ chart.margin = function(_) {
223
+ if (!arguments.length) return margin;
224
+ margin = _;
225
+ return chart;
226
+ };
227
+
228
+ chart.width = function(_) {
229
+ if (!arguments.length) return width;
230
+ width = d3.functor(_);
231
+ return chart;
232
+ };
233
+
234
+ chart.height = function(_) {
235
+ if (!arguments.length) return height;
236
+ height = d3.functor(_);
237
+ return chart;
238
+ };
239
+
240
+ chart.color = function(_) {
241
+ if (!arguments.length) return color;
242
+ color = _;
243
+ legend.color(_);
244
+ return chart;
245
+ };
246
+
247
+ chart.showDistX = function(_) {
248
+ if (!arguments.length) return showDistX;
249
+ showDistX = _;
250
+ return chart;
251
+ };
252
+
253
+ chart.showDistY = function(_) {
254
+ if (!arguments.length) return showDistY;
255
+ showDistY = _;
256
+ return chart;
257
+ };
258
+
259
+
260
+ return chart;
261
+ }
@@ -0,0 +1,286 @@
1
+
2
+ nv.models.stackedArea = function() {
3
+ //Default Settings
4
+ var margin = {top: 0, right: 0, bottom: 0, left: 0},
5
+ width = 960,
6
+ height = 500,
7
+ color = d3.scale.category20().range(), // array of colors to be used in order
8
+ id = Math.floor(Math.random() * 100000), //Create semi-unique ID incase user doesn't selet one
9
+ getX = function(d) { return d.x }, // accessor to get the x value from a data point
10
+ getY = function(d) { return d.y }, // accessor to get the y value from a data point
11
+ style = 'stack',
12
+ offset = 'zero',
13
+ order = 'default',
14
+ clipEdge = false; // if true, masks lines within x and y scale
15
+
16
+ /************************************
17
+ * offset:
18
+ * 'wiggle' (stream)
19
+ * 'zero' (stacked)
20
+ * 'expand' (normalize to 100%)
21
+ * 'silhouette' (simple centered)
22
+ *
23
+ * order:
24
+ * 'inside-out' (stream)
25
+ * 'default' (input order)
26
+ ************************************/
27
+
28
+ var scatter= nv.models.scatter()
29
+ .size(2.2) // default size
30
+ .sizeDomain([2.5]), //set to speed up calculation, needs to be unset if there is a cstom size accessor
31
+ x = scatter.xScale(),
32
+ y = scatter.yScale(),
33
+ dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'areaClick', 'areaMouseover', 'areaMouseout');
34
+
35
+ function chart(selection) {
36
+ selection.each(function(data) {
37
+ // Need to leave data alone to switch between stacked, stream, and expanded
38
+ var dataCopy = JSON.parse(JSON.stringify(data)),
39
+ availableWidth = width - margin.left - margin.right,
40
+ availableHeight = height - margin.top - margin.bottom;
41
+
42
+ //TODO: try to get rid of the need for copying the data, and use the data directly
43
+
44
+ //console.log(dataCopy);
45
+ dataCopy = dataCopy.map(function(series,i) {
46
+ if (series.disabled)
47
+ series.values = series.values.map(function(d,i) {
48
+ d._y = d.y || d._y;
49
+ d.y = 0; //TODO: need to use value from getY, not always d.y
50
+ return d
51
+ });
52
+ return series;
53
+ });
54
+
55
+
56
+ //TODO: deal with negative stacked charts
57
+
58
+ //compute the data based on offset and order (calc's y0 for every point)
59
+ dataCopy = d3.layout.stack()
60
+ .offset(offset)
61
+ .order(order)
62
+ .values(function(d){ return d.values })
63
+ .y(getY)
64
+ (dataCopy);
65
+
66
+
67
+
68
+ var wrap = d3.select(this).selectAll('g.wrap.stackedarea').data([dataCopy]);
69
+ var wrapEnter = wrap.enter().append('g').attr('class', 'wrap nvd3 stackedarea');
70
+ var defsEnter = wrapEnter.append('defs');
71
+ var gEnter = wrapEnter.append('g');
72
+ var g = wrap.select('g');
73
+
74
+ gEnter.append('g').attr('class', 'areaWrap');
75
+
76
+
77
+ scatter
78
+ .width(availableWidth)
79
+ .height(availableHeight)
80
+ //.x(getX)
81
+ .y(function(d) { return d.y + d.y0 }) // TODO: allow for getY to be other than d.y
82
+ .forceY([0])
83
+ .color(dataCopy.map(function(d,i) {
84
+ return d.color || color[i % color.length];
85
+ }).filter(function(d,i) { return !dataCopy[i].disabled }));
86
+
87
+ gEnter.append('g').attr('class', 'scatterWrap');
88
+ var scatterWrap= g.select('.scatterWrap')
89
+ .datum(dataCopy.filter(function(d) { return !d.disabled }))
90
+
91
+ d3.transition(scatterWrap).call(scatter);
92
+
93
+
94
+
95
+
96
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
97
+
98
+
99
+ defsEnter.append('clipPath')
100
+ .attr('id', 'edge-clip-' + id)
101
+ .append('rect');
102
+
103
+ wrap.select('#edge-clip-' + id + ' rect')
104
+ .attr('width', availableWidth)
105
+ .attr('height', availableHeight);
106
+
107
+ g .attr('clip-path', clipEdge ? 'url(#edge-clip-' + id + ')' : '');
108
+
109
+
110
+
111
+
112
+ var area = d3.svg.area()
113
+ .x(function(d,i) { return x(scatter.x()(d,i)) })
114
+ .y0(function(d) { return y(d.y0) })
115
+ .y1(function(d) { return y(d.y + d.y0) });
116
+
117
+ var zeroArea = d3.svg.area()
118
+ .x(function(d,i) { return x(scatter.x()(d,i)) })
119
+ .y0(function(d) { return y(d.y0) })
120
+ .y1(function(d) { return y(d.y0) });
121
+
122
+
123
+ var path = g.select('.areaWrap').selectAll('path.area')
124
+ .data(function(d) { return d });
125
+ //.data(function(d) { return d }, function(d) { return d.key });
126
+ path.enter().append('path').attr('class', function(d,i) { return 'area area-' + i })
127
+ .on('mouseover', function(d,i) {
128
+ d3.select(this).classed('hover', true);
129
+ dispatch.areaMouseover({
130
+ point: d,
131
+ series: d.key,
132
+ //pos: [x(getX(point, d.point)) + margin.left, y(getY(point, d.point)) + margin.top],
133
+ pos: [d3.event.pageX, d3.event.pageY],
134
+ seriesIndex: i
135
+ //pointIndex: d.point
136
+ });
137
+ })
138
+ .on('mouseout', function(d,i) {
139
+ d3.select(this).classed('hover', false);
140
+ dispatch.areaMouseout({
141
+ point: d,
142
+ series: d.key,
143
+ //pos: [x(getX(point, d.point)) + margin.left, y(getY(point, d.point)) + margin.top],
144
+ pos: [d3.event.pageX, d3.event.pageY],
145
+ seriesIndex: i
146
+ //pointIndex: d.point
147
+ });
148
+ })
149
+ .on('click', function(d,i) {
150
+ d3.select(this).classed('hover', false);
151
+ dispatch.areaClick({
152
+ point: d,
153
+ series: d.key,
154
+ //pos: [x(getX(point, d.point)) + margin.left, y(getY(point, d.point)) + margin.top],
155
+ pos: [d3.event.pageX, d3.event.pageY],
156
+ seriesIndex: i
157
+ //pointIndex: d.point
158
+ });
159
+ })
160
+ d3.transition(path.exit())
161
+ .attr('d', function(d,i) { return zeroArea(d.values,i) }) // TODO: fix this so transition is still fluid
162
+ .remove();
163
+ path
164
+ .style('fill', function(d,i){ return d.color || color[i % color.length] })
165
+ .style('stroke', function(d,i){ return d.color || color[i % color.length] });
166
+ d3.transition(path)
167
+ .attr('d', function(d,i) { return area(d.values,i) })
168
+
169
+
170
+ scatter.dispatch.on('elementClick.area', function(e) {
171
+ dispatch.areaClick(e);
172
+ })
173
+ scatter.dispatch.on('elementMouseover.area', function(e) {
174
+ g.select('.area-' + e.seriesIndex).classed('hover', true);
175
+ });
176
+ scatter.dispatch.on('elementMouseout.area', function(e) {
177
+ g.select('.area-' + e.seriesIndex).classed('hover', false);
178
+ });
179
+
180
+ });
181
+
182
+
183
+ return chart;
184
+ }
185
+
186
+
187
+ chart.dispatch = dispatch;
188
+ chart.scatter = scatter;
189
+
190
+ d3.rebind(chart, scatter, 'x', 'interactive', 'size', 'xScale', 'yScale', 'zScale', 'xDomain', 'yDomain', 'sizeDomain', 'forceX', 'forceY', 'forceSize', 'clipVoronoi', 'clipRadius');
191
+
192
+ /*
193
+ chart.x = function(_) {
194
+ if (!arguments.length) return getX;
195
+ getX = d3.functor(_);
196
+ scatter.x(_);
197
+ return chart;
198
+ };
199
+ */
200
+
201
+ chart.y = function(_) {
202
+ if (!arguments.length) return getY;
203
+ getY = d3.functor(_);
204
+ //scatter.y(_);
205
+ return chart;
206
+ }
207
+
208
+ chart.margin = function(_) {
209
+ if (!arguments.length) return margin;
210
+ margin = _;
211
+ return chart;
212
+ };
213
+
214
+ chart.width = function(_) {
215
+ if (!arguments.length) return width;
216
+ width = _;
217
+ return chart;
218
+ };
219
+
220
+ chart.height = function(_) {
221
+ if (!arguments.length) return height;
222
+ height = _;
223
+ return chart;
224
+ };
225
+
226
+ chart.clipEdge = function(_) {
227
+ if (!arguments.length) return clipEdge;
228
+ clipEdge = _;
229
+ return chart;
230
+ };
231
+
232
+ chart.color = function(_) {
233
+ if (!arguments.length) return color;
234
+ color = _;
235
+ return chart;
236
+ };
237
+
238
+ chart.offset = function(_) {
239
+ if (!arguments.length) return offset;
240
+ offset = _;
241
+ return chart;
242
+ };
243
+
244
+ chart.order = function(_) {
245
+ if (!arguments.length) return order;
246
+ order = _;
247
+ return chart;
248
+ };
249
+
250
+ //shortcut for offset + order
251
+ chart.style = function(_) {
252
+ if (!arguments.length) return style;
253
+ style = _;
254
+
255
+ switch (style) {
256
+ case 'stack':
257
+ offset = 'zero';
258
+ order = 'default';
259
+ break;
260
+ case 'stream':
261
+ offset = 'wiggle';
262
+ order = 'inside-out';
263
+ break;
264
+ case 'expand':
265
+ offset = 'expand';
266
+ order = 'default';
267
+ break;
268
+ }
269
+
270
+ return chart;
271
+ };
272
+
273
+
274
+
275
+ scatter.dispatch.on('elementMouseover.tooltip', function(e) {
276
+ e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top],
277
+ dispatch.tooltipShow(e);
278
+ });
279
+
280
+ scatter.dispatch.on('elementMouseout.tooltip', function(e) {
281
+ dispatch.tooltipHide(e);
282
+ });
283
+
284
+
285
+ return chart;
286
+ }