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.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.travis.yml +13 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +37 -0
- data/History.txt +6 -0
- data/LICENSE.txt +23 -0
- data/{README.txt → README.md} +15 -12
- data/Rakefile +4 -11
- data/lib/rubyvis.rb +1 -1
- data/lib/rubyvis/scale/quantitative.rb +14 -18
- data/lib/rubyvis/scene/svg_label.rb +1 -1
- data/rubyvis.gemspec +21 -0
- data/spec/anchor_spec.rb +2 -1
- data/spec/line_spec.rb +2 -2
- data/spec/scale_linear_datetime_spec.rb +23 -8
- data/spec/spec_helper.rb +2 -1
- metadata +31 -214
- data/.gemtest +0 -0
- data/vendor/protovis/protovis-r3.3.js +0 -287
- data/vendor/protovis/src/behavior/Behavior.js +0 -32
- data/vendor/protovis/src/behavior/Drag.js +0 -112
- data/vendor/protovis/src/behavior/Pan.js +0 -110
- data/vendor/protovis/src/behavior/Point.js +0 -157
- data/vendor/protovis/src/behavior/Resize.js +0 -104
- data/vendor/protovis/src/behavior/Select.js +0 -100
- data/vendor/protovis/src/behavior/Zoom.js +0 -85
- data/vendor/protovis/src/color/Color.js +0 -598
- data/vendor/protovis/src/color/Colors.js +0 -135
- data/vendor/protovis/src/color/Ramp.js +0 -17
- data/vendor/protovis/src/data/Arrays.js +0 -277
- data/vendor/protovis/src/data/Dom.js +0 -380
- data/vendor/protovis/src/data/Flatten.js +0 -146
- data/vendor/protovis/src/data/Histogram.js +0 -120
- data/vendor/protovis/src/data/LinearScale.js +0 -54
- data/vendor/protovis/src/data/LogScale.js +0 -142
- data/vendor/protovis/src/data/Nest.js +0 -257
- data/vendor/protovis/src/data/Numbers.js +0 -313
- data/vendor/protovis/src/data/Objects.js +0 -78
- data/vendor/protovis/src/data/OrdinalScale.js +0 -267
- data/vendor/protovis/src/data/QuantileScale.js +0 -180
- data/vendor/protovis/src/data/QuantitativeScale.js +0 -440
- data/vendor/protovis/src/data/RootScale.js +0 -55
- data/vendor/protovis/src/data/Scale.js +0 -86
- data/vendor/protovis/src/data/Transform.js +0 -109
- data/vendor/protovis/src/data/Tree.js +0 -124
- data/vendor/protovis/src/data/Vector.js +0 -118
- data/vendor/protovis/src/geo/Geo.js +0 -5
- data/vendor/protovis/src/geo/GeoScale.js +0 -307
- data/vendor/protovis/src/geo/LatLng.js +0 -23
- data/vendor/protovis/src/geo/Projection.js +0 -43
- data/vendor/protovis/src/geo/Projections.js +0 -117
- data/vendor/protovis/src/lang/Array.js +0 -112
- data/vendor/protovis/src/lang/init.js +0 -26
- data/vendor/protovis/src/layout/Arc.js +0 -178
- data/vendor/protovis/src/layout/Bullet.js +0 -164
- data/vendor/protovis/src/layout/Cluster.js +0 -205
- data/vendor/protovis/src/layout/Force.js +0 -309
- data/vendor/protovis/src/layout/Grid.js +0 -119
- data/vendor/protovis/src/layout/Hierarchy.js +0 -249
- data/vendor/protovis/src/layout/Horizon.js +0 -159
- data/vendor/protovis/src/layout/Indent.js +0 -83
- data/vendor/protovis/src/layout/Layout.js +0 -56
- data/vendor/protovis/src/layout/Matrix.js +0 -177
- data/vendor/protovis/src/layout/Network.js +0 -302
- data/vendor/protovis/src/layout/Pack.js +0 -323
- data/vendor/protovis/src/layout/Partition.js +0 -203
- data/vendor/protovis/src/layout/Rollup.js +0 -203
- data/vendor/protovis/src/layout/Stack.js +0 -391
- data/vendor/protovis/src/layout/Tree.js +0 -282
- data/vendor/protovis/src/layout/Treemap.js +0 -347
- data/vendor/protovis/src/mark/Anchor.js +0 -81
- data/vendor/protovis/src/mark/Area.js +0 -268
- data/vendor/protovis/src/mark/Bar.js +0 -93
- data/vendor/protovis/src/mark/Dot.js +0 -212
- data/vendor/protovis/src/mark/Ease.js +0 -150
- data/vendor/protovis/src/mark/Image.js +0 -154
- data/vendor/protovis/src/mark/Label.js +0 -155
- data/vendor/protovis/src/mark/Line.js +0 -195
- data/vendor/protovis/src/mark/Mark.js +0 -1237
- data/vendor/protovis/src/mark/Panel.js +0 -273
- data/vendor/protovis/src/mark/Rule.js +0 -143
- data/vendor/protovis/src/mark/Transient.js +0 -7
- data/vendor/protovis/src/mark/Transition.js +0 -195
- data/vendor/protovis/src/mark/Wedge.js +0 -244
- data/vendor/protovis/src/physics/BoundConstraint.js +0 -75
- data/vendor/protovis/src/physics/ChargeForce.js +0 -184
- data/vendor/protovis/src/physics/CollisionConstraint.js +0 -113
- data/vendor/protovis/src/physics/Constraint.js +0 -26
- data/vendor/protovis/src/physics/DragForce.js +0 -49
- data/vendor/protovis/src/physics/Force.js +0 -25
- data/vendor/protovis/src/physics/Particle.js +0 -81
- data/vendor/protovis/src/physics/PositionConstraint.js +0 -72
- data/vendor/protovis/src/physics/Quadtree.js +0 -195
- data/vendor/protovis/src/physics/Simulation.js +0 -159
- data/vendor/protovis/src/physics/SpringForce.js +0 -141
- data/vendor/protovis/src/pv-internals.js +0 -154
- data/vendor/protovis/src/pv.js +0 -95
- data/vendor/protovis/src/scene/SvgArea.js +0 -172
- data/vendor/protovis/src/scene/SvgBar.js +0 -28
- data/vendor/protovis/src/scene/SvgCurve.js +0 -354
- data/vendor/protovis/src/scene/SvgDot.js +0 -81
- data/vendor/protovis/src/scene/SvgImage.js +0 -45
- data/vendor/protovis/src/scene/SvgLabel.js +0 -46
- data/vendor/protovis/src/scene/SvgLine.js +0 -159
- data/vendor/protovis/src/scene/SvgPanel.js +0 -126
- data/vendor/protovis/src/scene/SvgRule.js +0 -26
- data/vendor/protovis/src/scene/SvgScene.js +0 -185
- data/vendor/protovis/src/scene/SvgWedge.js +0 -66
- data/vendor/protovis/src/text/DateFormat.js +0 -262
- data/vendor/protovis/src/text/Format.js +0 -78
- data/vendor/protovis/src/text/NumberFormat.js +0 -227
- 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
|
-
};
|