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,78 +0,0 @@
1
- /**
2
- * Returns all of the property names (keys) of the specified object (a map). The
3
- * order of the returned array is not defined.
4
- *
5
- * @param map an object.
6
- * @returns {string[]} an array of strings corresponding to the keys.
7
- * @see #entries
8
- */
9
- pv.keys = function(map) {
10
- var array = [];
11
- for (var key in map) {
12
- array.push(key);
13
- }
14
- return array;
15
- };
16
-
17
- /**
18
- * Returns all of the entries (key-value pairs) of the specified object (a
19
- * map). The order of the returned array is not defined. Each key-value pair is
20
- * represented as an object with <tt>key</tt> and <tt>value</tt> attributes,
21
- * e.g., <tt>{key: "foo", value: 42}</tt>.
22
- *
23
- * @param map an object.
24
- * @returns {array} an array of key-value pairs corresponding to the keys.
25
- */
26
- pv.entries = function(map) {
27
- var array = [];
28
- for (var key in map) {
29
- array.push({ key: key, value: map[key] });
30
- }
31
- return array;
32
- };
33
-
34
- /**
35
- * Returns all of the values (attribute values) of the specified object (a
36
- * map). The order of the returned array is not defined.
37
- *
38
- * @param map an object.
39
- * @returns {array} an array of objects corresponding to the values.
40
- * @see #entries
41
- */
42
- pv.values = function(map) {
43
- var array = [];
44
- for (var key in map) {
45
- array.push(map[key]);
46
- }
47
- return array;
48
- };
49
-
50
- /**
51
- * Returns a map constructed from the specified <tt>keys</tt>, using the
52
- * function <tt>f</tt> to compute the value for each key. The single argument to
53
- * the value function is the key. The callback is invoked only for indexes of
54
- * the array which have assigned values; it is not invoked for indexes which
55
- * have been deleted or which have never been assigned values.
56
- *
57
- * <p>For example, this expression creates a map from strings to string length:
58
- *
59
- * <pre>pv.dict(["one", "three", "seventeen"], function(s) s.length)</pre>
60
- *
61
- * The returned value is <tt>{one: 3, three: 5, seventeen: 9}</tt>. Accessor
62
- * functions can refer to <tt>this.index</tt>.
63
- *
64
- * @param {array} keys an array.
65
- * @param {function} f a value function.
66
- * @returns a map from keys to values.
67
- */
68
- pv.dict = function(keys, f) {
69
- var m = {}, o = {};
70
- for (var i = 0; i < keys.length; i++) {
71
- if (i in keys) {
72
- var k = keys[i];
73
- o.index = i;
74
- m[k] = f.call(o, k);
75
- }
76
- }
77
- return m;
78
- };
@@ -1,267 +0,0 @@
1
- /**
2
- * Returns an ordinal scale for the specified domain. The arguments to this
3
- * constructor are optional, and equivalent to calling {@link #domain}.
4
- *
5
- * @class Represents an ordinal scale. <style
6
- * type="text/css">sub{line-height:0}</style> An ordinal scale represents a
7
- * pairwise mapping from <i>n</i> discrete values in the input domain to
8
- * <i>n</i> discrete values in the output range. For example, an ordinal scale
9
- * might map a domain of species ["setosa", "versicolor", "virginica"] to colors
10
- * ["red", "green", "blue"]. Thus, saying
11
- *
12
- * <pre> .fillStyle(function(d) {
13
- * switch (d.species) {
14
- * case "setosa": return "red";
15
- * case "versicolor": return "green";
16
- * case "virginica": return "blue";
17
- * }
18
- * })</pre>
19
- *
20
- * is equivalent to
21
- *
22
- * <pre> .fillStyle(pv.Scale.ordinal("setosa", "versicolor", "virginica")
23
- * .range("red", "green", "blue")
24
- * .by(function(d) d.species))</pre>
25
- *
26
- * If the mapping from species to color does not need to be specified
27
- * explicitly, the domain can be omitted. In this case it will be inferred
28
- * lazily from the data:
29
- *
30
- * <pre> .fillStyle(pv.colors("red", "green", "blue")
31
- * .by(function(d) d.species))</pre>
32
- *
33
- * When the domain is inferred, the first time the scale is invoked, the first
34
- * element from the range will be returned. Subsequent calls with unique values
35
- * will return subsequent elements from the range. If the inferred domain grows
36
- * larger than the range, range values will be reused. However, it is strongly
37
- * recommended that the domain and the range contain the same number of
38
- * elements.
39
- *
40
- * <p>A range can be discretized from a continuous interval (e.g., for pixel
41
- * positioning) by using {@link #split}, {@link #splitFlush} or
42
- * {@link #splitBanded} after the domain has been set. For example, if
43
- * <tt>states</tt> is an array of the fifty U.S. state names, the state name can
44
- * be encoded in the left position:
45
- *
46
- * <pre> .left(pv.Scale.ordinal(states)
47
- * .split(0, 640)
48
- * .by(function(d) d.state))</pre>
49
- *
50
- * <p>N.B.: ordinal scales are not invertible (at least not yet), since the
51
- * domain and range and discontinuous. A workaround is to use a linear scale.
52
- *
53
- * @param {...} domain... optional domain values.
54
- * @extends pv.Scale
55
- * @see pv.colors
56
- */
57
- pv.Scale.ordinal = function() {
58
- var d = [], i = {}, r = [], band = 0;
59
-
60
- /** @private */
61
- function scale(x) {
62
- if (!(x in i)) i[x] = d.push(x) - 1;
63
- return r[i[x] % r.length];
64
- }
65
-
66
- /**
67
- * Sets or gets the input domain. This method can be invoked several ways:
68
- *
69
- * <p>1. <tt>domain(values...)</tt>
70
- *
71
- * <p>Specifying the domain as a series of values is the most explicit and
72
- * recommended approach. However, if the domain values are derived from data,
73
- * you may find the second method more appropriate.
74
- *
75
- * <p>2. <tt>domain(array, f)</tt>
76
- *
77
- * <p>Rather than enumerating the domain values as explicit arguments to this
78
- * method, you can specify a single argument of an array. In addition, you can
79
- * specify an optional accessor function to extract the domain values from the
80
- * array.
81
- *
82
- * <p>3. <tt>domain()</tt>
83
- *
84
- * <p>Invoking the <tt>domain</tt> method with no arguments returns the
85
- * current domain as an array.
86
- *
87
- * @function
88
- * @name pv.Scale.ordinal.prototype.domain
89
- * @param {...} domain... domain values.
90
- * @returns {pv.Scale.ordinal} <tt>this</tt>, or the current domain.
91
- */
92
- scale.domain = function(array, f) {
93
- if (arguments.length) {
94
- array = (array instanceof Array)
95
- ? ((arguments.length > 1) ? pv.map(array, f) : array)
96
- : Array.prototype.slice.call(arguments);
97
-
98
- /* Filter the specified ordinals to their unique values. */
99
- d = [];
100
- var seen = {};
101
- for (var j = 0; j < array.length; j++) {
102
- var o = array[j];
103
- if (!(o in seen)) {
104
- seen[o] = true;
105
- d.push(o);
106
- }
107
- }
108
-
109
- i = pv.numerate(d);
110
- return this;
111
- }
112
- return d;
113
- };
114
-
115
- /**
116
- * Sets or gets the output range. This method can be invoked several ways:
117
- *
118
- * <p>1. <tt>range(values...)</tt>
119
- *
120
- * <p>Specifying the range as a series of values is the most explicit and
121
- * recommended approach. However, if the range values are derived from data,
122
- * you may find the second method more appropriate.
123
- *
124
- * <p>2. <tt>range(array, f)</tt>
125
- *
126
- * <p>Rather than enumerating the range values as explicit arguments to this
127
- * method, you can specify a single argument of an array. In addition, you can
128
- * specify an optional accessor function to extract the range values from the
129
- * array.
130
- *
131
- * <p>3. <tt>range()</tt>
132
- *
133
- * <p>Invoking the <tt>range</tt> method with no arguments returns the
134
- * current range as an array.
135
- *
136
- * @function
137
- * @name pv.Scale.ordinal.prototype.range
138
- * @param {...} range... range values.
139
- * @returns {pv.Scale.ordinal} <tt>this</tt>, or the current range.
140
- */
141
- scale.range = function(array, f) {
142
- if (arguments.length) {
143
- r = (array instanceof Array)
144
- ? ((arguments.length > 1) ? pv.map(array, f) : array)
145
- : Array.prototype.slice.call(arguments);
146
- if (typeof r[0] == "string") r = r.map(pv.color);
147
- return this;
148
- }
149
- return r;
150
- };
151
-
152
- /**
153
- * Sets the range from the given continuous interval. The interval
154
- * [<i>min</i>, <i>max</i>] is subdivided into <i>n</i> equispaced points,
155
- * where <i>n</i> is the number of (unique) values in the domain. The first
156
- * and last point are offset from the edge of the range by half the distance
157
- * between points.
158
- *
159
- * <p>This method must be called <i>after</i> the domain is set.
160
- *
161
- * @function
162
- * @name pv.Scale.ordinal.prototype.split
163
- * @param {number} min minimum value of the output range.
164
- * @param {number} max maximum value of the output range.
165
- * @returns {pv.Scale.ordinal} <tt>this</tt>.
166
- * @see #splitFlush
167
- * @see #splitBanded
168
- */
169
- scale.split = function(min, max) {
170
- var step = (max - min) / this.domain().length;
171
- r = pv.range(min + step / 2, max, step);
172
- return this;
173
- };
174
-
175
- /**
176
- * Sets the range from the given continuous interval. The interval
177
- * [<i>min</i>, <i>max</i>] is subdivided into <i>n</i> equispaced points,
178
- * where <i>n</i> is the number of (unique) values in the domain. The first
179
- * and last point are exactly on the edge of the range.
180
- *
181
- * <p>This method must be called <i>after</i> the domain is set.
182
- *
183
- * @function
184
- * @name pv.Scale.ordinal.prototype.splitFlush
185
- * @param {number} min minimum value of the output range.
186
- * @param {number} max maximum value of the output range.
187
- * @returns {pv.Scale.ordinal} <tt>this</tt>.
188
- * @see #split
189
- */
190
- scale.splitFlush = function(min, max) {
191
- var n = this.domain().length, step = (max - min) / (n - 1);
192
- r = (n == 1) ? [(min + max) / 2]
193
- : pv.range(min, max + step / 2, step);
194
- return this;
195
- };
196
-
197
- /**
198
- * Sets the range from the given continuous interval. The interval
199
- * [<i>min</i>, <i>max</i>] is subdivided into <i>n</i> equispaced bands,
200
- * where <i>n</i> is the number of (unique) values in the domain. The first
201
- * and last band are offset from the edge of the range by the distance between
202
- * bands.
203
- *
204
- * <p>The band width argument, <tt>band</tt>, is typically in the range [0, 1]
205
- * and defaults to 1. This fraction corresponds to the amount of space in the
206
- * range to allocate to the bands, as opposed to padding. A value of 0.5 means
207
- * that the band width will be equal to the padding width. The computed
208
- * absolute band width can be retrieved from the range as
209
- * <tt>scale.range().band</tt>.
210
- *
211
- * <p>If the band width argument is negative, this method will allocate bands
212
- * of a <i>fixed</i> width <tt>-band</tt>, rather than a relative fraction of
213
- * the available space.
214
- *
215
- * <p>Tip: to inset the bands by a fixed amount <tt>p</tt>, specify a minimum
216
- * value of <tt>min + p</tt> (or simply <tt>p</tt>, if <tt>min</tt> is
217
- * 0). Then set the mark width to <tt>scale.range().band - p</tt>.
218
- *
219
- * <p>This method must be called <i>after</i> the domain is set.
220
- *
221
- * @function
222
- * @name pv.Scale.ordinal.prototype.splitBanded
223
- * @param {number} min minimum value of the output range.
224
- * @param {number} max maximum value of the output range.
225
- * @param {number} [band] the fractional band width in [0, 1]; defaults to 1.
226
- * @returns {pv.Scale.ordinal} <tt>this</tt>.
227
- * @see #split
228
- */
229
- scale.splitBanded = function(min, max, band) {
230
- if (arguments.length < 3) band = 1;
231
- if (band < 0) {
232
- var n = this.domain().length,
233
- total = -band * n,
234
- remaining = max - min - total,
235
- padding = remaining / (n + 1);
236
- r = pv.range(min + padding, max, padding - band);
237
- r.band = -band;
238
- } else {
239
- var step = (max - min) / (this.domain().length + (1 - band));
240
- r = pv.range(min + step * (1 - band), max, step);
241
- r.band = step * band;
242
- }
243
- return this;
244
- };
245
-
246
- /**
247
- * Returns a view of this scale by the specified accessor function <tt>f</tt>.
248
- * Given a scale <tt>y</tt>, <tt>y.by(function(d) d.foo)</tt> is equivalent to
249
- * <tt>function(d) y(d.foo)</tt>. This method should be used judiciously; it
250
- * is typically more clear to invoke the scale directly, passing in the value
251
- * to be scaled.
252
- *
253
- * @function
254
- * @name pv.Scale.ordinal.prototype.by
255
- * @param {function} f an accessor function.
256
- * @returns {pv.Scale.ordinal} a view of this scale by the specified accessor
257
- * function.
258
- */
259
- scale.by = function(f) {
260
- function by() { return scale(f.apply(this, arguments)); }
261
- for (var method in scale) by[method] = scale[method];
262
- return by;
263
- };
264
-
265
- scale.domain.apply(scale, arguments);
266
- return scale;
267
- };
@@ -1,180 +0,0 @@
1
- /**
2
- * Constructs a default quantile scale. The arguments to this constructor are
3
- * optional, and equivalent to calling {@link #domain}. The default domain is
4
- * the empty set, and the default range is [0,1].
5
- *
6
- * @class Represents a quantile scale; a function that maps from a value within
7
- * a sortable domain to a quantized numeric range. Typically, the domain is a
8
- * set of numbers, but any sortable value (such as strings) can be used as the
9
- * domain of a quantile scale. The range defaults to [0,1], with 0 corresponding
10
- * to the smallest value in the domain, 1 the largest, .5 the median, etc.
11
- *
12
- * <p>By default, the number of quantiles in the range corresponds to the number
13
- * of values in the domain. The {@link #quantiles} method can be used to specify
14
- * an explicit number of quantiles; for example, <tt>quantiles(4)</tt> produces
15
- * a standard quartile scale. A quartile scale's range is a set of four discrete
16
- * values, such as [0, 1/3, 2/3, 1]. Calling the {@link #range} method will
17
- * scale these discrete values accordingly, similar to {@link
18
- * pv.Scale.ordinal#splitFlush}.
19
- *
20
- * <p>For example, given the strings ["c", "a", "b"], a default quantile scale:
21
- *
22
- * <pre>pv.Scale.quantile("c", "a", "b")</pre>
23
- *
24
- * will return 0 for "a", .5 for "b", and 1 for "c".
25
- *
26
- * @extends pv.Scale
27
- */
28
- pv.Scale.quantile = function() {
29
- var n = -1, // number of quantiles
30
- j = -1, // max quantile index
31
- q = [], // quantile boundaries
32
- d = [], // domain
33
- y = pv.Scale.linear(); // range
34
-
35
- /** @private */
36
- function scale(x) {
37
- return y(Math.max(0, Math.min(j, pv.search.index(q, x) - 1)) / j);
38
- }
39
-
40
- /**
41
- * Sets or gets the quantile boundaries. By default, each element in the
42
- * domain is in its own quantile. If the argument to this method is a number,
43
- * it specifies the number of equal-sized quantiles by which to divide the
44
- * domain.
45
- *
46
- * <p>If no arguments are specified, this method returns the quantile
47
- * boundaries; the first element is always the minimum value of the domain,
48
- * and the last element is the maximum value of the domain. Thus, the length
49
- * of the returned array is always one greater than the number of quantiles.
50
- *
51
- * @function
52
- * @name pv.Scale.quantile.prototype.quantiles
53
- * @param {number} x the number of quantiles.
54
- */
55
- scale.quantiles = function(x) {
56
- if (arguments.length) {
57
- n = Number(x);
58
- if (n < 0) {
59
- q = [d[0]].concat(d);
60
- j = d.length - 1;
61
- } else {
62
- q = [];
63
- q[0] = d[0];
64
- for (var i = 1; i <= n; i++) {
65
- q[i] = d[~~(i * (d.length - 1) / n)];
66
- }
67
- j = n - 1;
68
- }
69
- return this;
70
- }
71
- return q;
72
- };
73
-
74
- /**
75
- * Sets or gets the input domain. This method can be invoked several ways:
76
- *
77
- * <p>1. <tt>domain(values...)</tt>
78
- *
79
- * <p>Specifying the domain as a series of values is the most explicit and
80
- * recommended approach. However, if the domain values are derived from data,
81
- * you may find the second method more appropriate.
82
- *
83
- * <p>2. <tt>domain(array, f)</tt>
84
- *
85
- * <p>Rather than enumerating the domain values as explicit arguments to this
86
- * method, you can specify a single argument of an array. In addition, you can
87
- * specify an optional accessor function to extract the domain values from the
88
- * array.
89
- *
90
- * <p>3. <tt>domain()</tt>
91
- *
92
- * <p>Invoking the <tt>domain</tt> method with no arguments returns the
93
- * current domain as an array.
94
- *
95
- * @function
96
- * @name pv.Scale.quantile.prototype.domain
97
- * @param {...} domain... domain values.
98
- * @returns {pv.Scale.quantile} <tt>this</tt>, or the current domain.
99
- */
100
- scale.domain = function(array, f) {
101
- if (arguments.length) {
102
- d = (array instanceof Array)
103
- ? pv.map(array, f)
104
- : Array.prototype.slice.call(arguments);
105
- d.sort(pv.naturalOrder);
106
- scale.quantiles(n); // recompute quantiles
107
- return this;
108
- }
109
- return d;
110
- };
111
-
112
- /**
113
- * Sets or gets the output range. This method can be invoked several ways:
114
- *
115
- * <p>1. <tt>range(min, ..., max)</tt>
116
- *
117
- * <p>The range may be specified as a series of numbers or colors. Most
118
- * commonly, two numbers are specified: the minimum and maximum pixel values.
119
- * For a color scale, values may be specified as {@link pv.Color}s or
120
- * equivalent strings. For a diverging scale, or other subdivided non-uniform
121
- * scales, multiple values can be specified. For example:
122
- *
123
- * <pre> .range("red", "white", "green")</pre>
124
- *
125
- * <p>Currently, only numbers and colors are supported as range values. The
126
- * number of range values must exactly match the number of domain values, or
127
- * the behavior of the scale is undefined.
128
- *
129
- * <p>2. <tt>range()</tt>
130
- *
131
- * <p>Invoking the <tt>range</tt> method with no arguments returns the current
132
- * range as an array of numbers or colors.
133
- *
134
- * @function
135
- * @name pv.Scale.quantile.prototype.range
136
- * @param {...} range... range values.
137
- * @returns {pv.Scale.quantile} <tt>this</tt>, or the current range.
138
- */
139
- scale.range = function() {
140
- if (arguments.length) {
141
- y.range.apply(y, arguments);
142
- return this;
143
- }
144
- return y.range();
145
- };
146
-
147
- /**
148
- * Returns a view of this scale by the specified accessor function <tt>f</tt>.
149
- * Given a scale <tt>y</tt>, <tt>y.by(function(d) d.foo)</tt> is equivalent to
150
- * <tt>function(d) y(d.foo)</tt>.
151
- *
152
- * <p>This method is provided for convenience, such that scales can be
153
- * succinctly defined inline. For example, given an array of data elements
154
- * that have a <tt>score</tt> attribute with the domain [0, 1], the height
155
- * property could be specified as:
156
- *
157
- * <pre>.height(pv.Scale.linear().range(0, 480).by(function(d) d.score))</pre>
158
- *
159
- * This is equivalent to:
160
- *
161
- * <pre>.height(function(d) d.score * 480)</pre>
162
- *
163
- * This method should be used judiciously; it is typically more clear to
164
- * invoke the scale directly, passing in the value to be scaled.
165
- *
166
- * @function
167
- * @name pv.Scale.quantile.prototype.by
168
- * @param {function} f an accessor function.
169
- * @returns {pv.Scale.quantile} a view of this scale by the specified
170
- * accessor function.
171
- */
172
- scale.by = function(f) {
173
- function by() { return scale(f.apply(this, arguments)); }
174
- for (var method in scale) by[method] = scale[method];
175
- return by;
176
- };
177
-
178
- scale.domain.apply(scale, arguments);
179
- return scale;
180
- };