rubyvis 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
- };