rubyvis 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.travis.yml +13 -0
  4. data/Gemfile +8 -0
  5. data/Gemfile.lock +37 -0
  6. data/History.txt +6 -0
  7. data/LICENSE.txt +23 -0
  8. data/{README.txt → README.md} +15 -12
  9. data/Rakefile +4 -11
  10. data/lib/rubyvis.rb +1 -1
  11. data/lib/rubyvis/scale/quantitative.rb +14 -18
  12. data/lib/rubyvis/scene/svg_label.rb +1 -1
  13. data/rubyvis.gemspec +21 -0
  14. data/spec/anchor_spec.rb +2 -1
  15. data/spec/line_spec.rb +2 -2
  16. data/spec/scale_linear_datetime_spec.rb +23 -8
  17. data/spec/spec_helper.rb +2 -1
  18. metadata +31 -214
  19. data/.gemtest +0 -0
  20. data/vendor/protovis/protovis-r3.3.js +0 -287
  21. data/vendor/protovis/src/behavior/Behavior.js +0 -32
  22. data/vendor/protovis/src/behavior/Drag.js +0 -112
  23. data/vendor/protovis/src/behavior/Pan.js +0 -110
  24. data/vendor/protovis/src/behavior/Point.js +0 -157
  25. data/vendor/protovis/src/behavior/Resize.js +0 -104
  26. data/vendor/protovis/src/behavior/Select.js +0 -100
  27. data/vendor/protovis/src/behavior/Zoom.js +0 -85
  28. data/vendor/protovis/src/color/Color.js +0 -598
  29. data/vendor/protovis/src/color/Colors.js +0 -135
  30. data/vendor/protovis/src/color/Ramp.js +0 -17
  31. data/vendor/protovis/src/data/Arrays.js +0 -277
  32. data/vendor/protovis/src/data/Dom.js +0 -380
  33. data/vendor/protovis/src/data/Flatten.js +0 -146
  34. data/vendor/protovis/src/data/Histogram.js +0 -120
  35. data/vendor/protovis/src/data/LinearScale.js +0 -54
  36. data/vendor/protovis/src/data/LogScale.js +0 -142
  37. data/vendor/protovis/src/data/Nest.js +0 -257
  38. data/vendor/protovis/src/data/Numbers.js +0 -313
  39. data/vendor/protovis/src/data/Objects.js +0 -78
  40. data/vendor/protovis/src/data/OrdinalScale.js +0 -267
  41. data/vendor/protovis/src/data/QuantileScale.js +0 -180
  42. data/vendor/protovis/src/data/QuantitativeScale.js +0 -440
  43. data/vendor/protovis/src/data/RootScale.js +0 -55
  44. data/vendor/protovis/src/data/Scale.js +0 -86
  45. data/vendor/protovis/src/data/Transform.js +0 -109
  46. data/vendor/protovis/src/data/Tree.js +0 -124
  47. data/vendor/protovis/src/data/Vector.js +0 -118
  48. data/vendor/protovis/src/geo/Geo.js +0 -5
  49. data/vendor/protovis/src/geo/GeoScale.js +0 -307
  50. data/vendor/protovis/src/geo/LatLng.js +0 -23
  51. data/vendor/protovis/src/geo/Projection.js +0 -43
  52. data/vendor/protovis/src/geo/Projections.js +0 -117
  53. data/vendor/protovis/src/lang/Array.js +0 -112
  54. data/vendor/protovis/src/lang/init.js +0 -26
  55. data/vendor/protovis/src/layout/Arc.js +0 -178
  56. data/vendor/protovis/src/layout/Bullet.js +0 -164
  57. data/vendor/protovis/src/layout/Cluster.js +0 -205
  58. data/vendor/protovis/src/layout/Force.js +0 -309
  59. data/vendor/protovis/src/layout/Grid.js +0 -119
  60. data/vendor/protovis/src/layout/Hierarchy.js +0 -249
  61. data/vendor/protovis/src/layout/Horizon.js +0 -159
  62. data/vendor/protovis/src/layout/Indent.js +0 -83
  63. data/vendor/protovis/src/layout/Layout.js +0 -56
  64. data/vendor/protovis/src/layout/Matrix.js +0 -177
  65. data/vendor/protovis/src/layout/Network.js +0 -302
  66. data/vendor/protovis/src/layout/Pack.js +0 -323
  67. data/vendor/protovis/src/layout/Partition.js +0 -203
  68. data/vendor/protovis/src/layout/Rollup.js +0 -203
  69. data/vendor/protovis/src/layout/Stack.js +0 -391
  70. data/vendor/protovis/src/layout/Tree.js +0 -282
  71. data/vendor/protovis/src/layout/Treemap.js +0 -347
  72. data/vendor/protovis/src/mark/Anchor.js +0 -81
  73. data/vendor/protovis/src/mark/Area.js +0 -268
  74. data/vendor/protovis/src/mark/Bar.js +0 -93
  75. data/vendor/protovis/src/mark/Dot.js +0 -212
  76. data/vendor/protovis/src/mark/Ease.js +0 -150
  77. data/vendor/protovis/src/mark/Image.js +0 -154
  78. data/vendor/protovis/src/mark/Label.js +0 -155
  79. data/vendor/protovis/src/mark/Line.js +0 -195
  80. data/vendor/protovis/src/mark/Mark.js +0 -1237
  81. data/vendor/protovis/src/mark/Panel.js +0 -273
  82. data/vendor/protovis/src/mark/Rule.js +0 -143
  83. data/vendor/protovis/src/mark/Transient.js +0 -7
  84. data/vendor/protovis/src/mark/Transition.js +0 -195
  85. data/vendor/protovis/src/mark/Wedge.js +0 -244
  86. data/vendor/protovis/src/physics/BoundConstraint.js +0 -75
  87. data/vendor/protovis/src/physics/ChargeForce.js +0 -184
  88. data/vendor/protovis/src/physics/CollisionConstraint.js +0 -113
  89. data/vendor/protovis/src/physics/Constraint.js +0 -26
  90. data/vendor/protovis/src/physics/DragForce.js +0 -49
  91. data/vendor/protovis/src/physics/Force.js +0 -25
  92. data/vendor/protovis/src/physics/Particle.js +0 -81
  93. data/vendor/protovis/src/physics/PositionConstraint.js +0 -72
  94. data/vendor/protovis/src/physics/Quadtree.js +0 -195
  95. data/vendor/protovis/src/physics/Simulation.js +0 -159
  96. data/vendor/protovis/src/physics/SpringForce.js +0 -141
  97. data/vendor/protovis/src/pv-internals.js +0 -154
  98. data/vendor/protovis/src/pv.js +0 -95
  99. data/vendor/protovis/src/scene/SvgArea.js +0 -172
  100. data/vendor/protovis/src/scene/SvgBar.js +0 -28
  101. data/vendor/protovis/src/scene/SvgCurve.js +0 -354
  102. data/vendor/protovis/src/scene/SvgDot.js +0 -81
  103. data/vendor/protovis/src/scene/SvgImage.js +0 -45
  104. data/vendor/protovis/src/scene/SvgLabel.js +0 -46
  105. data/vendor/protovis/src/scene/SvgLine.js +0 -159
  106. data/vendor/protovis/src/scene/SvgPanel.js +0 -126
  107. data/vendor/protovis/src/scene/SvgRule.js +0 -26
  108. data/vendor/protovis/src/scene/SvgScene.js +0 -185
  109. data/vendor/protovis/src/scene/SvgWedge.js +0 -66
  110. data/vendor/protovis/src/text/DateFormat.js +0 -262
  111. data/vendor/protovis/src/text/Format.js +0 -78
  112. data/vendor/protovis/src/text/NumberFormat.js +0 -227
  113. data/vendor/protovis/src/text/TimeFormat.js +0 -115
@@ -1,323 +0,0 @@
1
- /**
2
- * Constructs a new, empty circle-packing layout. Layouts are not typically
3
- * constructed directly; instead, they are added to an existing panel via
4
- * {@link pv.Mark#add}.
5
- *
6
- * @class Implements a hierarchical layout using circle-packing. The meaning of
7
- * the exported mark prototypes changes slightly in the space-filling
8
- * implementation:<ul>
9
- *
10
- * <li><tt>node</tt> - for rendering nodes; typically a {@link pv.Dot}.
11
- *
12
- * <p><li><tt>link</tt> - unsupported; undefined. Links are encoded implicitly
13
- * in the arrangement of the space-filling nodes.
14
- *
15
- * <p><li><tt>label</tt> - for rendering node labels; typically a
16
- * {@link pv.Label}.
17
- *
18
- * </ul>The pack layout support dynamic sizing for leaf nodes, if a
19
- * {@link #size} psuedo-property is specified. The default size function returns
20
- * 1, causing all leaf nodes to be sized equally, and all internal nodes to be
21
- * sized by the number of leaf nodes they have as descendants.
22
- *
23
- * <p>The size function can be used in conjunction with the order property,
24
- * which allows the nodes to the sorted by the computed size. Note: for sorting
25
- * based on other data attributes, simply use the default <tt>null</tt> for the
26
- * order property, and sort the nodes beforehand using the {@link pv.Dom}
27
- * operator.
28
- *
29
- * <p>For more details on how to use this layout, see
30
- * {@link pv.Layout.Hierarchy}.
31
- *
32
- * @extends pv.Layout.Hierarchy
33
- * @see <a href="http://portal.acm.org/citation.cfm?id=1124772.1124851"
34
- * >"Visualization of large hierarchical data by circle packing"</a> by W. Wang,
35
- * H. Wang, G. Dai, and H. Wang, ACM CHI 2006.
36
- */
37
- pv.Layout.Pack = function() {
38
- pv.Layout.Hierarchy.call(this);
39
-
40
- this.node
41
- .shapeRadius(function(n) { return n.radius; })
42
- .strokeStyle("rgb(31, 119, 180)")
43
- .fillStyle("rgba(31, 119, 180, .25)");
44
-
45
- this.label
46
- .textAlign("center");
47
-
48
- /* Hide unsupported link. */
49
- delete this.link;
50
- };
51
-
52
- pv.Layout.Pack.prototype = pv.extend(pv.Layout.Hierarchy)
53
- .property("spacing", Number)
54
- .property("order", String); // ascending, descending, reverse, null
55
-
56
- /**
57
- * Default properties for circle-packing layouts. The default spacing parameter
58
- * is 1 and the default order is "ascending".
59
- *
60
- * @type pv.Layout.Pack
61
- */
62
- pv.Layout.Pack.prototype.defaults = new pv.Layout.Pack()
63
- .extend(pv.Layout.Hierarchy.prototype.defaults)
64
- .spacing(1)
65
- .order("ascending");
66
-
67
- /**
68
- * The spacing parameter; defaults to 1, which provides a little bit of padding
69
- * between sibling nodes and the enclosing circle. Larger values increase the
70
- * spacing, by making the sibling nodes smaller; a value of zero makes the leaf
71
- * nodes as large as possible, with no padding on enclosing circles.
72
- *
73
- * @type number
74
- * @name pv.Layout.Pack.prototype.spacing
75
- */
76
-
77
- /**
78
- * The sibling node order. The default order is <tt>null</tt>, which means to
79
- * use the sibling order specified by the nodes property as-is. A value of
80
- * "ascending" will sort siblings in ascending order of size, while "descending"
81
- * will do the reverse. For sorting based on data attributes other than size,
82
- * use the default <tt>null</tt> for the order property, and sort the nodes
83
- * beforehand using the {@link pv.Dom} operator.
84
- *
85
- * @see pv.Dom.Node#sort
86
- * @type string
87
- * @name pv.Layout.Pack.prototype.order
88
- */
89
-
90
- /** @private The default size function. */
91
- pv.Layout.Pack.prototype.$radius = function() { return 1; };
92
-
93
- // TODO is it possible for spacing to operate in pixel space?
94
- // Right now it appears to be multiples of the smallest radius.
95
-
96
- /**
97
- * Specifies the sizing function. By default, a sizing function is disabled and
98
- * all nodes are given constant size. The sizing function is invoked for each
99
- * leaf node in the tree (passed to the constructor).
100
- *
101
- * <p>For example, if the tree data structure represents a file system, with
102
- * files as leaf nodes, and each file has a <tt>bytes</tt> attribute, you can
103
- * specify a size function as:
104
- *
105
- * <pre> .size(function(d) d.bytes)</pre>
106
- *
107
- * As with other properties, a size function may specify additional arguments to
108
- * access the data associated with the layout and any enclosing panels.
109
- *
110
- * @param {function} f the new sizing function.
111
- * @returns {pv.Layout.Pack} this.
112
- */
113
- pv.Layout.Pack.prototype.size = function(f) {
114
- this.$radius = typeof f == "function"
115
- ? function() { return Math.sqrt(f.apply(this, arguments)); }
116
- : (f = Math.sqrt(f), function() { return f; });
117
- return this;
118
- };
119
-
120
- /** @private */
121
- pv.Layout.Pack.prototype.buildImplied = function(s) {
122
- if (pv.Layout.Hierarchy.prototype.buildImplied.call(this, s)) return;
123
-
124
- var that = this,
125
- nodes = s.nodes,
126
- root = nodes[0];
127
-
128
- /** @private Compute the radii of the leaf nodes. */
129
- function radii(nodes) {
130
- var stack = pv.Mark.stack;
131
- stack.unshift(null);
132
- for (var i = 0, n = nodes.length; i < n; i++) {
133
- var c = nodes[i];
134
- if (!c.firstChild) {
135
- c.radius = that.$radius.apply(that, (stack[0] = c, stack));
136
- }
137
- }
138
- stack.shift();
139
- }
140
-
141
- /** @private */
142
- function packTree(n) {
143
- var nodes = [];
144
- for (var c = n.firstChild; c; c = c.nextSibling) {
145
- if (c.firstChild) c.radius = packTree(c);
146
- c.n = c.p = c;
147
- nodes.push(c);
148
- }
149
-
150
- /* Sort. */
151
- switch (s.order) {
152
- case "ascending": {
153
- nodes.sort(function(a, b) { return a.radius - b.radius; });
154
- break;
155
- }
156
- case "descending": {
157
- nodes.sort(function(a, b) { return b.radius - a.radius; });
158
- break;
159
- }
160
- case "reverse": nodes.reverse(); break;
161
- }
162
-
163
- return packCircle(nodes);
164
- }
165
-
166
- /** @private */
167
- function packCircle(nodes) {
168
- var xMin = Infinity,
169
- xMax = -Infinity,
170
- yMin = Infinity,
171
- yMax = -Infinity,
172
- a, b, c, j, k;
173
-
174
- /** @private */
175
- function bound(n) {
176
- xMin = Math.min(n.x - n.radius, xMin);
177
- xMax = Math.max(n.x + n.radius, xMax);
178
- yMin = Math.min(n.y - n.radius, yMin);
179
- yMax = Math.max(n.y + n.radius, yMax);
180
- }
181
-
182
- /** @private */
183
- function insert(a, b) {
184
- var c = a.n;
185
- a.n = b;
186
- b.p = a;
187
- b.n = c;
188
- c.p = b;
189
- }
190
-
191
- /** @private */
192
- function splice(a, b) {
193
- a.n = b;
194
- b.p = a;
195
- }
196
-
197
- /** @private */
198
- function intersects(a, b) {
199
- var dx = b.x - a.x,
200
- dy = b.y - a.y,
201
- dr = a.radius + b.radius;
202
- return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon
203
- }
204
-
205
- /* Create first node. */
206
- a = nodes[0];
207
- a.x = -a.radius;
208
- a.y = 0;
209
- bound(a);
210
-
211
- /* Create second node. */
212
- if (nodes.length > 1) {
213
- b = nodes[1];
214
- b.x = b.radius;
215
- b.y = 0;
216
- bound(b);
217
-
218
- /* Create third node and build chain. */
219
- if (nodes.length > 2) {
220
- c = nodes[2];
221
- place(a, b, c);
222
- bound(c);
223
- insert(a, c);
224
- a.p = c;
225
- insert(c, b);
226
- b = a.n;
227
-
228
- /* Now iterate through the rest. */
229
- for (var i = 3; i < nodes.length; i++) {
230
- place(a, b, c = nodes[i]);
231
-
232
- /* Search for the closest intersection. */
233
- var isect = 0, s1 = 1, s2 = 1;
234
- for (j = b.n; j != b; j = j.n, s1++) {
235
- if (intersects(j, c)) {
236
- isect = 1;
237
- break;
238
- }
239
- }
240
- if (isect == 1) {
241
- for (k = a.p; k != j.p; k = k.p, s2++) {
242
- if (intersects(k, c)) {
243
- if (s2 < s1) {
244
- isect = -1;
245
- j = k;
246
- }
247
- break;
248
- }
249
- }
250
- }
251
-
252
- /* Update node chain. */
253
- if (isect == 0) {
254
- insert(a, c);
255
- b = c;
256
- bound(c);
257
- } else if (isect > 0) {
258
- splice(a, j);
259
- b = j;
260
- i--;
261
- } else if (isect < 0) {
262
- splice(j, b);
263
- a = j;
264
- i--;
265
- }
266
- }
267
- }
268
- }
269
-
270
- /* Re-center the circles and return the encompassing radius. */
271
- var cx = (xMin + xMax) / 2,
272
- cy = (yMin + yMax) / 2,
273
- cr = 0;
274
- for (var i = 0; i < nodes.length; i++) {
275
- var n = nodes[i];
276
- n.x -= cx;
277
- n.y -= cy;
278
- cr = Math.max(cr, n.radius + Math.sqrt(n.x * n.x + n.y * n.y));
279
- }
280
- return cr + s.spacing;
281
- }
282
-
283
- /** @private */
284
- function place(a, b, c) {
285
- var da = b.radius + c.radius,
286
- db = a.radius + c.radius,
287
- dx = b.x - a.x,
288
- dy = b.y - a.y,
289
- dc = Math.sqrt(dx * dx + dy * dy),
290
- cos = (db * db + dc * dc - da * da) / (2 * db * dc),
291
- theta = Math.acos(cos),
292
- x = cos * db,
293
- h = Math.sin(theta) * db;
294
- dx /= dc;
295
- dy /= dc;
296
- c.x = a.x + x * dx + h * dy;
297
- c.y = a.y + x * dy - h * dx;
298
- }
299
-
300
- /** @private */
301
- function transform(n, x, y, k) {
302
- for (var c = n.firstChild; c; c = c.nextSibling) {
303
- c.x += n.x;
304
- c.y += n.y;
305
- transform(c, x, y, k);
306
- }
307
- n.x = x + k * n.x;
308
- n.y = y + k * n.y;
309
- n.radius *= k;
310
- }
311
-
312
- radii(nodes);
313
-
314
- /* Recursively compute the layout. */
315
- root.x = 0;
316
- root.y = 0;
317
- root.radius = packTree(root);
318
-
319
- var w = this.width(),
320
- h = this.height(),
321
- k = 1 / Math.max(2 * root.radius / w, 2 * root.radius / h);
322
- transform(root, w / 2, h / 2, k);
323
- };
@@ -1,203 +0,0 @@
1
- /**
2
- * Constructs a new, empty partition layout. Layouts are not typically
3
- * constructed directly; instead, they are added to an existing panel via
4
- * {@link pv.Mark#add}.
5
- *
6
- * @class Implemeents a hierarchical layout using the partition (or sunburst,
7
- * icicle) algorithm. This layout provides both node-link and space-filling
8
- * implementations of partition diagrams. In many ways it is similar to
9
- * {@link pv.Layout.Cluster}, except that leaf nodes are positioned based on
10
- * their distance from the root.
11
- *
12
- * <p>The partition layout support dynamic sizing for leaf nodes, if a
13
- * {@link #size} psuedo-property is specified. The default size function returns
14
- * 1, causing all leaf nodes to be sized equally, and all internal nodes to be
15
- * sized by the number of leaf nodes they have as descendants.
16
- *
17
- * <p>The size function can be used in conjunction with the order property,
18
- * which allows the nodes to the sorted by the computed size. Note: for sorting
19
- * based on other data attributes, simply use the default <tt>null</tt> for the
20
- * order property, and sort the nodes beforehand using the {@link pv.Dom}
21
- * operator.
22
- *
23
- * <p>For more details on how to use this layout, see
24
- * {@link pv.Layout.Hierarchy}.
25
- *
26
- * @see pv.Layout.Partition.Fill
27
- * @extends pv.Layout.Hierarchy
28
- */
29
- pv.Layout.Partition = function() {
30
- pv.Layout.Hierarchy.call(this);
31
- };
32
-
33
- pv.Layout.Partition.prototype = pv.extend(pv.Layout.Hierarchy)
34
- .property("order", String) // null, ascending, descending?
35
- .property("orient", String) // top, left, right, bottom, radial
36
- .property("innerRadius", Number)
37
- .property("outerRadius", Number);
38
-
39
- /**
40
- * The sibling node order. The default order is <tt>null</tt>, which means to
41
- * use the sibling order specified by the nodes property as-is. A value of
42
- * "ascending" will sort siblings in ascending order of size, while "descending"
43
- * will do the reverse. For sorting based on data attributes other than size,
44
- * use the default <tt>null</tt> for the order property, and sort the nodes
45
- * beforehand using the {@link pv.Dom} operator.
46
- *
47
- * @see pv.Dom.Node#sort
48
- * @type string
49
- * @name pv.Layout.Partition.prototype.order
50
- */
51
-
52
- /**
53
- * The orientation. The default orientation is "top", which means that the root
54
- * node is placed on the top edge, leaf nodes appear at the bottom, and internal
55
- * nodes are in-between. The following orientations are supported:<ul>
56
- *
57
- * <li>left - left-to-right.
58
- * <li>right - right-to-left.
59
- * <li>top - top-to-bottom.
60
- * <li>bottom - bottom-to-top.
61
- * <li>radial - radially, with the root at the center.</ul>
62
- *
63
- * @type string
64
- * @name pv.Layout.Partition.prototype.orient
65
- */
66
-
67
- /**
68
- * The inner radius; defaults to 0. This property applies only to radial
69
- * orientations, and can be used to compress the layout radially. Note that for
70
- * the node-link implementation, the root node is always at the center,
71
- * regardless of the value of this property; this property only affects internal
72
- * and leaf nodes. For the space-filling implementation, a non-zero value of
73
- * this property will result in the root node represented as a ring rather than
74
- * a circle.
75
- *
76
- * @type number
77
- * @name pv.Layout.Partition.prototype.innerRadius
78
- */
79
-
80
- /**
81
- * The outer radius; defaults to fill the containing panel, based on the height
82
- * and width of the layout. If the layout has no height and width specified, it
83
- * will extend to fill the enclosing panel.
84
- *
85
- * @type number
86
- * @name pv.Layout.Partition.prototype.outerRadius
87
- */
88
-
89
- /**
90
- * Default properties for partition layouts. The default orientation is "top".
91
- *
92
- * @type pv.Layout.Partition
93
- */
94
- pv.Layout.Partition.prototype.defaults = new pv.Layout.Partition()
95
- .extend(pv.Layout.Hierarchy.prototype.defaults)
96
- .orient("top");
97
-
98
- /** @private */
99
- pv.Layout.Partition.prototype.$size = function() { return 1; };
100
-
101
- /**
102
- * Specifies the sizing function. By default, a sizing function is disabled and
103
- * all nodes are given constant size. The sizing function is invoked for each
104
- * leaf node in the tree (passed to the constructor).
105
- *
106
- * <p>For example, if the tree data structure represents a file system, with
107
- * files as leaf nodes, and each file has a <tt>bytes</tt> attribute, you can
108
- * specify a size function as:
109
- *
110
- * <pre> .size(function(d) d.bytes)</pre>
111
- *
112
- * As with other properties, a size function may specify additional arguments to
113
- * access the data associated with the layout and any enclosing panels.
114
- *
115
- * @param {function} f the new sizing function.
116
- * @returns {pv.Layout.Partition} this.
117
- */
118
- pv.Layout.Partition.prototype.size = function(f) {
119
- this.$size = f;
120
- return this;
121
- };
122
-
123
- /** @private */
124
- pv.Layout.Partition.prototype.buildImplied = function(s) {
125
- if (pv.Layout.Hierarchy.prototype.buildImplied.call(this, s)) return;
126
-
127
- var that = this,
128
- root = s.nodes[0],
129
- stack = pv.Mark.stack,
130
- maxDepth = 0;
131
-
132
- /* Recursively compute the tree depth and node size. */
133
- stack.unshift(null);
134
- root.visitAfter(function(n, i) {
135
- if (i > maxDepth) maxDepth = i;
136
- n.size = n.firstChild
137
- ? pv.sum(n.childNodes, function(n) { return n.size; })
138
- : that.$size.apply(that, (stack[0] = n, stack));
139
- });
140
- stack.shift();
141
-
142
- /* Order */
143
- switch (s.order) {
144
- case "ascending": root.sort(function(a, b) { return a.size - b.size; }); break;
145
- case "descending": root.sort(function(b, a) { return a.size - b.size; }); break;
146
- }
147
-
148
- /* Compute the unit breadth and depth of each node. */
149
- var ds = 1 / maxDepth;
150
- root.minBreadth = 0;
151
- root.breadth = .5;
152
- root.maxBreadth = 1;
153
- root.visitBefore(function(n) {
154
- var b = n.minBreadth, s = n.maxBreadth - b;
155
- for (var c = n.firstChild; c; c = c.nextSibling) {
156
- c.minBreadth = b;
157
- c.maxBreadth = b += (c.size / n.size) * s;
158
- c.breadth = (b + c.minBreadth) / 2;
159
- }
160
- });
161
- root.visitAfter(function(n, i) {
162
- n.minDepth = (i - 1) * ds;
163
- n.maxDepth = n.depth = i * ds;
164
- });
165
-
166
- pv.Layout.Hierarchy.NodeLink.buildImplied.call(this, s);
167
- };
168
-
169
- /**
170
- * Constructs a new, empty space-filling partition layout. Layouts are not
171
- * typically constructed directly; instead, they are added to an existing panel
172
- * via {@link pv.Mark#add}.
173
- *
174
- * @class A variant of partition layout that is space-filling. The meaning of
175
- * the exported mark prototypes changes slightly in the space-filling
176
- * implementation:<ul>
177
- *
178
- * <li><tt>node</tt> - for rendering nodes; typically a {@link pv.Bar} for
179
- * non-radial orientations, and a {@link pv.Wedge} for radial orientations.
180
- *
181
- * <p><li><tt>link</tt> - unsupported; undefined. Links are encoded implicitly
182
- * in the arrangement of the space-filling nodes.
183
- *
184
- * <p><li><tt>label</tt> - for rendering node labels; typically a
185
- * {@link pv.Label}.
186
- *
187
- * </ul>For more details on how to use this layout, see
188
- * {@link pv.Layout.Partition}.
189
- *
190
- * @extends pv.Layout.Partition
191
- */
192
- pv.Layout.Partition.Fill = function() {
193
- pv.Layout.Partition.call(this);
194
- pv.Layout.Hierarchy.Fill.constructor.call(this);
195
- };
196
-
197
- pv.Layout.Partition.Fill.prototype = pv.extend(pv.Layout.Partition);
198
-
199
- /** @private */
200
- pv.Layout.Partition.Fill.prototype.buildImplied = function(s) {
201
- if (pv.Layout.Partition.prototype.buildImplied.call(this, s)) return;
202
- pv.Layout.Hierarchy.Fill.buildImplied.call(this, s);
203
- };