rubyvis 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- 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,257 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Returns a {@link pv.Nest} operator for the specified array. This is a
|
3
|
-
* convenience factory method, equivalent to <tt>new pv.Nest(array)</tt>.
|
4
|
-
*
|
5
|
-
* @see pv.Nest
|
6
|
-
* @param {array} array an array of elements to nest.
|
7
|
-
* @returns {pv.Nest} a nest operator for the specified array.
|
8
|
-
*/
|
9
|
-
pv.nest = function(array) {
|
10
|
-
return new pv.Nest(array);
|
11
|
-
};
|
12
|
-
|
13
|
-
/**
|
14
|
-
* Constructs a nest operator for the specified array. This constructor should
|
15
|
-
* not be invoked directly; use {@link pv.nest} instead.
|
16
|
-
*
|
17
|
-
* @class Represents a {@link Nest} operator for the specified array. Nesting
|
18
|
-
* allows elements in an array to be grouped into a hierarchical tree
|
19
|
-
* structure. The levels in the tree are specified by <i>key</i> functions. The
|
20
|
-
* leaf nodes of the tree can be sorted by value, while the internal nodes can
|
21
|
-
* be sorted by key. Finally, the tree can be returned either has a
|
22
|
-
* multidimensional array via {@link #entries}, or as a hierarchical map via
|
23
|
-
* {@link #map}. The {@link #rollup} routine similarly returns a map, collapsing
|
24
|
-
* the elements in each leaf node using a summary function.
|
25
|
-
*
|
26
|
-
* <p>For example, consider the following tabular data structure of Barley
|
27
|
-
* yields, from various sites in Minnesota during 1931-2:
|
28
|
-
*
|
29
|
-
* <pre>{ yield: 27.00, variety: "Manchuria", year: 1931, site: "University Farm" },
|
30
|
-
* { yield: 48.87, variety: "Manchuria", year: 1931, site: "Waseca" },
|
31
|
-
* { yield: 27.43, variety: "Manchuria", year: 1931, site: "Morris" }, ...</pre>
|
32
|
-
*
|
33
|
-
* To facilitate visualization, it may be useful to nest the elements first by
|
34
|
-
* year, and then by variety, as follows:
|
35
|
-
*
|
36
|
-
* <pre>var nest = pv.nest(yields)
|
37
|
-
* .key(function(d) d.year)
|
38
|
-
* .key(function(d) d.variety)
|
39
|
-
* .entries();</pre>
|
40
|
-
*
|
41
|
-
* This returns a nested array. Each element of the outer array is a key-values
|
42
|
-
* pair, listing the values for each distinct key:
|
43
|
-
*
|
44
|
-
* <pre>{ key: 1931, values: [
|
45
|
-
* { key: "Manchuria", values: [
|
46
|
-
* { yield: 27.00, variety: "Manchuria", year: 1931, site: "University Farm" },
|
47
|
-
* { yield: 48.87, variety: "Manchuria", year: 1931, site: "Waseca" },
|
48
|
-
* { yield: 27.43, variety: "Manchuria", year: 1931, site: "Morris" },
|
49
|
-
* ...
|
50
|
-
* ] },
|
51
|
-
* { key: "Glabron", values: [
|
52
|
-
* { yield: 43.07, variety: "Glabron", year: 1931, site: "University Farm" },
|
53
|
-
* { yield: 55.20, variety: "Glabron", year: 1931, site: "Waseca" },
|
54
|
-
* ...
|
55
|
-
* ] },
|
56
|
-
* ] },
|
57
|
-
* { key: 1932, values: ... }</pre>
|
58
|
-
*
|
59
|
-
* Further details, including sorting and rollup, is provided below on the
|
60
|
-
* corresponding methods.
|
61
|
-
*
|
62
|
-
* @param {array} array an array of elements to nest.
|
63
|
-
*/
|
64
|
-
pv.Nest = function(array) {
|
65
|
-
this.array = array;
|
66
|
-
this.keys = [];
|
67
|
-
};
|
68
|
-
|
69
|
-
/**
|
70
|
-
* Nests using the specified key function. Multiple keys may be added to the
|
71
|
-
* nest; the array elements will be nested in the order keys are specified.
|
72
|
-
*
|
73
|
-
* @param {function} key a key function; must return a string or suitable map
|
74
|
-
* key.
|
75
|
-
* @returns {pv.Nest} this.
|
76
|
-
*/
|
77
|
-
pv.Nest.prototype.key = function(key) {
|
78
|
-
this.keys.push(key);
|
79
|
-
return this;
|
80
|
-
};
|
81
|
-
|
82
|
-
/**
|
83
|
-
* Sorts the previously-added keys. The natural sort order is used by default
|
84
|
-
* (see {@link pv.naturalOrder}); if an alternative order is desired,
|
85
|
-
* <tt>order</tt> should be a comparator function. If this method is not called
|
86
|
-
* (i.e., keys are <i>unsorted</i>), keys will appear in the order they appear
|
87
|
-
* in the underlying elements array. For example,
|
88
|
-
*
|
89
|
-
* <pre>pv.nest(yields)
|
90
|
-
* .key(function(d) d.year)
|
91
|
-
* .key(function(d) d.variety)
|
92
|
-
* .sortKeys()
|
93
|
-
* .entries()</pre>
|
94
|
-
*
|
95
|
-
* groups yield data by year, then variety, and sorts the variety groups
|
96
|
-
* lexicographically (since the variety attribute is a string).
|
97
|
-
*
|
98
|
-
* <p>Key sort order is only used in conjunction with {@link #entries}, which
|
99
|
-
* returns an array of key-values pairs. If the nest is used to construct a
|
100
|
-
* {@link #map} instead, keys are unsorted.
|
101
|
-
*
|
102
|
-
* @param {function} [order] an optional comparator function.
|
103
|
-
* @returns {pv.Nest} this.
|
104
|
-
*/
|
105
|
-
pv.Nest.prototype.sortKeys = function(order) {
|
106
|
-
this.keys[this.keys.length - 1].order = order || pv.naturalOrder;
|
107
|
-
return this;
|
108
|
-
};
|
109
|
-
|
110
|
-
/**
|
111
|
-
* Sorts the leaf values. The natural sort order is used by default (see
|
112
|
-
* {@link pv.naturalOrder}); if an alternative order is desired, <tt>order</tt>
|
113
|
-
* should be a comparator function. If this method is not called (i.e., values
|
114
|
-
* are <i>unsorted</i>), values will appear in the order they appear in the
|
115
|
-
* underlying elements array. For example,
|
116
|
-
*
|
117
|
-
* <pre>pv.nest(yields)
|
118
|
-
* .key(function(d) d.year)
|
119
|
-
* .key(function(d) d.variety)
|
120
|
-
* .sortValues(function(a, b) a.yield - b.yield)
|
121
|
-
* .entries()</pre>
|
122
|
-
*
|
123
|
-
* groups yield data by year, then variety, and sorts the values for each
|
124
|
-
* variety group by yield.
|
125
|
-
*
|
126
|
-
* <p>Value sort order, unlike keys, applies to both {@link #entries} and
|
127
|
-
* {@link #map}. It has no effect on {@link #rollup}.
|
128
|
-
*
|
129
|
-
* @param {function} [order] an optional comparator function.
|
130
|
-
* @returns {pv.Nest} this.
|
131
|
-
*/
|
132
|
-
pv.Nest.prototype.sortValues = function(order) {
|
133
|
-
this.order = order || pv.naturalOrder;
|
134
|
-
return this;
|
135
|
-
};
|
136
|
-
|
137
|
-
/**
|
138
|
-
* Returns a hierarchical map of values. Each key adds one level to the
|
139
|
-
* hierarchy. With only a single key, the returned map will have a key for each
|
140
|
-
* distinct value of the key function; the correspond value with be an array of
|
141
|
-
* elements with that key value. If a second key is added, this will be a nested
|
142
|
-
* map. For example:
|
143
|
-
*
|
144
|
-
* <pre>pv.nest(yields)
|
145
|
-
* .key(function(d) d.variety)
|
146
|
-
* .key(function(d) d.site)
|
147
|
-
* .map()</pre>
|
148
|
-
*
|
149
|
-
* returns a map <tt>m</tt> such that <tt>m[variety][site]</tt> is an array, a subset of
|
150
|
-
* <tt>yields</tt>, with each element having the given variety and site.
|
151
|
-
*
|
152
|
-
* @returns a hierarchical map of values.
|
153
|
-
*/
|
154
|
-
pv.Nest.prototype.map = function() {
|
155
|
-
var map = {}, values = [];
|
156
|
-
|
157
|
-
/* Build the map. */
|
158
|
-
for (var i, j = 0; j < this.array.length; j++) {
|
159
|
-
var x = this.array[j];
|
160
|
-
var m = map;
|
161
|
-
for (i = 0; i < this.keys.length - 1; i++) {
|
162
|
-
var k = this.keys[i](x);
|
163
|
-
if (!m[k]) m[k] = {};
|
164
|
-
m = m[k];
|
165
|
-
}
|
166
|
-
k = this.keys[i](x);
|
167
|
-
if (!m[k]) {
|
168
|
-
var a = [];
|
169
|
-
values.push(a);
|
170
|
-
m[k] = a;
|
171
|
-
}
|
172
|
-
m[k].push(x);
|
173
|
-
}
|
174
|
-
|
175
|
-
/* Sort each leaf array. */
|
176
|
-
if (this.order) {
|
177
|
-
for (var i = 0; i < values.length; i++) {
|
178
|
-
values[i].sort(this.order);
|
179
|
-
}
|
180
|
-
}
|
181
|
-
|
182
|
-
return map;
|
183
|
-
};
|
184
|
-
|
185
|
-
/**
|
186
|
-
* Returns a hierarchical nested array. This method is similar to
|
187
|
-
* {@link pv.entries}, but works recursively on the entire hierarchy. Rather
|
188
|
-
* than returning a map like {@link #map}, this method returns a nested
|
189
|
-
* array. Each element of the array has a <tt>key</tt> and <tt>values</tt>
|
190
|
-
* field. For leaf nodes, the <tt>values</tt> array will be a subset of the
|
191
|
-
* underlying elements array; for non-leaf nodes, the <tt>values</tt> array will
|
192
|
-
* contain more key-values pairs.
|
193
|
-
*
|
194
|
-
* <p>For an example usage, see the {@link Nest} constructor.
|
195
|
-
*
|
196
|
-
* @returns a hierarchical nested array.
|
197
|
-
*/
|
198
|
-
pv.Nest.prototype.entries = function() {
|
199
|
-
|
200
|
-
/** Recursively extracts the entries for the given map. */
|
201
|
-
function entries(map) {
|
202
|
-
var array = [];
|
203
|
-
for (var k in map) {
|
204
|
-
var v = map[k];
|
205
|
-
array.push({ key: k, values: (v instanceof Array) ? v : entries(v) });
|
206
|
-
};
|
207
|
-
return array;
|
208
|
-
}
|
209
|
-
|
210
|
-
/** Recursively sorts the values for the given key-values array. */
|
211
|
-
function sort(array, i) {
|
212
|
-
var o = this.keys[i].order;
|
213
|
-
if (o) array.sort(function(a, b) { return o(a.key, b.key); });
|
214
|
-
if (++i < this.keys.length) {
|
215
|
-
for (var j = 0; j < array.length; j++) {
|
216
|
-
sort.call(this, array[j].values, i);
|
217
|
-
}
|
218
|
-
}
|
219
|
-
return array;
|
220
|
-
}
|
221
|
-
|
222
|
-
return sort.call(this, entries(this.map()), 0);
|
223
|
-
};
|
224
|
-
|
225
|
-
/**
|
226
|
-
* Returns a rollup map. The behavior of this method is the same as
|
227
|
-
* {@link #map}, except that the leaf values are replaced with the return value
|
228
|
-
* of the specified rollup function <tt>f</tt>. For example,
|
229
|
-
*
|
230
|
-
* <pre>pv.nest(yields)
|
231
|
-
* .key(function(d) d.site)
|
232
|
-
* .rollup(function(v) pv.median(v, function(d) d.yield))</pre>
|
233
|
-
*
|
234
|
-
* first groups yield data by site, and then returns a map from site to median
|
235
|
-
* yield for the given site.
|
236
|
-
*
|
237
|
-
* @see #map
|
238
|
-
* @param {function} f a rollup function.
|
239
|
-
* @returns a hierarchical map, with the leaf values computed by <tt>f</tt>.
|
240
|
-
*/
|
241
|
-
pv.Nest.prototype.rollup = function(f) {
|
242
|
-
|
243
|
-
/** Recursively descends to the leaf nodes (arrays) and does rollup. */
|
244
|
-
function rollup(map) {
|
245
|
-
for (var key in map) {
|
246
|
-
var value = map[key];
|
247
|
-
if (value instanceof Array) {
|
248
|
-
map[key] = f(value);
|
249
|
-
} else {
|
250
|
-
rollup(value);
|
251
|
-
}
|
252
|
-
}
|
253
|
-
return map;
|
254
|
-
}
|
255
|
-
|
256
|
-
return rollup(this.map());
|
257
|
-
};
|
@@ -1,313 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Returns an array of numbers, starting at <tt>start</tt>, incrementing by
|
3
|
-
* <tt>step</tt>, until <tt>stop</tt> is reached. The stop value is
|
4
|
-
* exclusive. If only a single argument is specified, this value is interpeted
|
5
|
-
* as the <i>stop</i> value, with the <i>start</i> value as zero. If only two
|
6
|
-
* arguments are specified, the step value is implied to be one.
|
7
|
-
*
|
8
|
-
* <p>The method is modeled after the built-in <tt>range</tt> method from
|
9
|
-
* Python. See the Python documentation for more details.
|
10
|
-
*
|
11
|
-
* @see <a href="http://docs.python.org/library/functions.html#range">Python range</a>
|
12
|
-
* @param {number} [start] the start value.
|
13
|
-
* @param {number} stop the stop value.
|
14
|
-
* @param {number} [step] the step value.
|
15
|
-
* @returns {number[]} an array of numbers.
|
16
|
-
*/
|
17
|
-
pv.range = function(start, stop, step) {
|
18
|
-
if (arguments.length == 1) {
|
19
|
-
stop = start;
|
20
|
-
start = 0;
|
21
|
-
}
|
22
|
-
if (step == undefined) step = 1;
|
23
|
-
if ((stop - start) / step == Infinity) throw new Error("range must be finite");
|
24
|
-
var array = [], i = 0, j;
|
25
|
-
stop -= (stop - start) * 1e-10; // floating point precision!
|
26
|
-
if (step < 0) {
|
27
|
-
while ((j = start + step * i++) > stop) {
|
28
|
-
array.push(j);
|
29
|
-
}
|
30
|
-
} else {
|
31
|
-
while ((j = start + step * i++) < stop) {
|
32
|
-
array.push(j);
|
33
|
-
}
|
34
|
-
}
|
35
|
-
return array;
|
36
|
-
};
|
37
|
-
|
38
|
-
/**
|
39
|
-
* Returns a random number in the range [<tt>start</tt>, <tt>stop</tt>) that is
|
40
|
-
* a multiple of <tt>step</tt>. More specifically, the returned number is of the
|
41
|
-
* form <tt>start</tt> + <i>n</i> * <tt>step</tt>, where <i>n</i> is a
|
42
|
-
* nonnegative integer. If <tt>step</tt> is not specified, it defaults to 1,
|
43
|
-
* returning a random integer if <tt>start</tt> is also an integer.
|
44
|
-
*
|
45
|
-
* @param {number} [start] the start value value.
|
46
|
-
* @param {number} stop the stop value.
|
47
|
-
* @param {number} [step] the step value.
|
48
|
-
* @returns {number} a random number between <i>start</i> and <i>stop</i>.
|
49
|
-
*/
|
50
|
-
pv.random = function(start, stop, step) {
|
51
|
-
if (arguments.length == 1) {
|
52
|
-
stop = start;
|
53
|
-
start = 0;
|
54
|
-
}
|
55
|
-
if (step == undefined) step = 1;
|
56
|
-
return step
|
57
|
-
? (Math.floor(Math.random() * (stop - start) / step) * step + start)
|
58
|
-
: (Math.random() * (stop - start) + start);
|
59
|
-
};
|
60
|
-
|
61
|
-
/**
|
62
|
-
* Returns the sum of the specified array. If the specified array is not an
|
63
|
-
* array of numbers, an optional accessor function <tt>f</tt> can be specified
|
64
|
-
* to map the elements to numbers. See {@link #normalize} for an example.
|
65
|
-
* Accessor functions can refer to <tt>this.index</tt>.
|
66
|
-
*
|
67
|
-
* @param {array} array an array of objects, or numbers.
|
68
|
-
* @param {function} [f] an optional accessor function.
|
69
|
-
* @returns {number} the sum of the specified array.
|
70
|
-
*/
|
71
|
-
pv.sum = function(array, f) {
|
72
|
-
var o = {};
|
73
|
-
return array.reduce(f
|
74
|
-
? function(p, d, i) { o.index = i; return p + f.call(o, d); }
|
75
|
-
: function(p, d) { return p + d; }, 0);
|
76
|
-
};
|
77
|
-
|
78
|
-
/**
|
79
|
-
* Returns the maximum value of the specified array. If the specified array is
|
80
|
-
* not an array of numbers, an optional accessor function <tt>f</tt> can be
|
81
|
-
* specified to map the elements to numbers. See {@link #normalize} for an
|
82
|
-
* example. Accessor functions can refer to <tt>this.index</tt>.
|
83
|
-
*
|
84
|
-
* @param {array} array an array of objects, or numbers.
|
85
|
-
* @param {function} [f] an optional accessor function.
|
86
|
-
* @returns {number} the maximum value of the specified array.
|
87
|
-
*/
|
88
|
-
pv.max = function(array, f) {
|
89
|
-
if (f == pv.index) return array.length - 1;
|
90
|
-
return Math.max.apply(null, f ? pv.map(array, f) : array);
|
91
|
-
};
|
92
|
-
|
93
|
-
/**
|
94
|
-
* Returns the index of the maximum value of the specified array. If the
|
95
|
-
* specified array is not an array of numbers, an optional accessor function
|
96
|
-
* <tt>f</tt> can be specified to map the elements to numbers. See
|
97
|
-
* {@link #normalize} for an example. Accessor functions can refer to
|
98
|
-
* <tt>this.index</tt>.
|
99
|
-
*
|
100
|
-
* @param {array} array an array of objects, or numbers.
|
101
|
-
* @param {function} [f] an optional accessor function.
|
102
|
-
* @returns {number} the index of the maximum value of the specified array.
|
103
|
-
*/
|
104
|
-
pv.max.index = function(array, f) {
|
105
|
-
if (!array.length) return -1;
|
106
|
-
if (f == pv.index) return array.length - 1;
|
107
|
-
if (!f) f = pv.identity;
|
108
|
-
var maxi = 0, maxx = -Infinity, o = {};
|
109
|
-
for (var i = 0; i < array.length; i++) {
|
110
|
-
o.index = i;
|
111
|
-
var x = f.call(o, array[i]);
|
112
|
-
if (x > maxx) {
|
113
|
-
maxx = x;
|
114
|
-
maxi = i;
|
115
|
-
}
|
116
|
-
}
|
117
|
-
return maxi;
|
118
|
-
}
|
119
|
-
|
120
|
-
/**
|
121
|
-
* Returns the minimum value of the specified array of numbers. If the specified
|
122
|
-
* array is not an array of numbers, an optional accessor function <tt>f</tt>
|
123
|
-
* can be specified to map the elements to numbers. See {@link #normalize} for
|
124
|
-
* an example. Accessor functions can refer to <tt>this.index</tt>.
|
125
|
-
*
|
126
|
-
* @param {array} array an array of objects, or numbers.
|
127
|
-
* @param {function} [f] an optional accessor function.
|
128
|
-
* @returns {number} the minimum value of the specified array.
|
129
|
-
*/
|
130
|
-
pv.min = function(array, f) {
|
131
|
-
if (f == pv.index) return 0;
|
132
|
-
return Math.min.apply(null, f ? pv.map(array, f) : array);
|
133
|
-
};
|
134
|
-
|
135
|
-
/**
|
136
|
-
* Returns the index of the minimum value of the specified array. If the
|
137
|
-
* specified array is not an array of numbers, an optional accessor function
|
138
|
-
* <tt>f</tt> can be specified to map the elements to numbers. See
|
139
|
-
* {@link #normalize} for an example. Accessor functions can refer to
|
140
|
-
* <tt>this.index</tt>.
|
141
|
-
*
|
142
|
-
* @param {array} array an array of objects, or numbers.
|
143
|
-
* @param {function} [f] an optional accessor function.
|
144
|
-
* @returns {number} the index of the minimum value of the specified array.
|
145
|
-
*/
|
146
|
-
pv.min.index = function(array, f) {
|
147
|
-
if (!array.length) return -1;
|
148
|
-
if (f == pv.index) return 0;
|
149
|
-
if (!f) f = pv.identity;
|
150
|
-
var mini = 0, minx = Infinity, o = {};
|
151
|
-
for (var i = 0; i < array.length; i++) {
|
152
|
-
o.index = i;
|
153
|
-
var x = f.call(o, array[i]);
|
154
|
-
if (x < minx) {
|
155
|
-
minx = x;
|
156
|
-
mini = i;
|
157
|
-
}
|
158
|
-
}
|
159
|
-
return mini;
|
160
|
-
}
|
161
|
-
|
162
|
-
/**
|
163
|
-
* Returns the arithmetic mean, or average, of the specified array. If the
|
164
|
-
* specified array is not an array of numbers, an optional accessor function
|
165
|
-
* <tt>f</tt> can be specified to map the elements to numbers. See
|
166
|
-
* {@link #normalize} for an example. Accessor functions can refer to
|
167
|
-
* <tt>this.index</tt>.
|
168
|
-
*
|
169
|
-
* @param {array} array an array of objects, or numbers.
|
170
|
-
* @param {function} [f] an optional accessor function.
|
171
|
-
* @returns {number} the mean of the specified array.
|
172
|
-
*/
|
173
|
-
pv.mean = function(array, f) {
|
174
|
-
return pv.sum(array, f) / array.length;
|
175
|
-
};
|
176
|
-
|
177
|
-
/**
|
178
|
-
* Returns the median of the specified array. If the specified array is not an
|
179
|
-
* array of numbers, an optional accessor function <tt>f</tt> can be specified
|
180
|
-
* to map the elements to numbers. See {@link #normalize} for an example.
|
181
|
-
* Accessor functions can refer to <tt>this.index</tt>.
|
182
|
-
*
|
183
|
-
* @param {array} array an array of objects, or numbers.
|
184
|
-
* @param {function} [f] an optional accessor function.
|
185
|
-
* @returns {number} the median of the specified array.
|
186
|
-
*/
|
187
|
-
pv.median = function(array, f) {
|
188
|
-
if (f == pv.index) return (array.length - 1) / 2;
|
189
|
-
array = pv.map(array, f).sort(pv.naturalOrder);
|
190
|
-
if (array.length % 2) return array[Math.floor(array.length / 2)];
|
191
|
-
var i = array.length / 2;
|
192
|
-
return (array[i - 1] + array[i]) / 2;
|
193
|
-
};
|
194
|
-
|
195
|
-
/**
|
196
|
-
* Returns the unweighted variance of the specified array. If the specified
|
197
|
-
* array is not an array of numbers, an optional accessor function <tt>f</tt>
|
198
|
-
* can be specified to map the elements to numbers. See {@link #normalize} for
|
199
|
-
* an example. Accessor functions can refer to <tt>this.index</tt>.
|
200
|
-
*
|
201
|
-
* @param {array} array an array of objects, or numbers.
|
202
|
-
* @param {function} [f] an optional accessor function.
|
203
|
-
* @returns {number} the variance of the specified array.
|
204
|
-
*/
|
205
|
-
pv.variance = function(array, f) {
|
206
|
-
if (array.length < 1) return NaN;
|
207
|
-
if (array.length == 1) return 0;
|
208
|
-
var mean = pv.mean(array, f), sum = 0, o = {};
|
209
|
-
if (!f) f = pv.identity;
|
210
|
-
for (var i = 0; i < array.length; i++) {
|
211
|
-
o.index = i;
|
212
|
-
var d = f.call(o, array[i]) - mean;
|
213
|
-
sum += d * d;
|
214
|
-
}
|
215
|
-
return sum;
|
216
|
-
};
|
217
|
-
|
218
|
-
/**
|
219
|
-
* Returns an unbiased estimation of the standard deviation of a population,
|
220
|
-
* given the specified random sample. If the specified array is not an array of
|
221
|
-
* numbers, an optional accessor function <tt>f</tt> can be specified to map the
|
222
|
-
* elements to numbers. See {@link #normalize} for an example. Accessor
|
223
|
-
* functions can refer to <tt>this.index</tt>.
|
224
|
-
*
|
225
|
-
* @param {array} array an array of objects, or numbers.
|
226
|
-
* @param {function} [f] an optional accessor function.
|
227
|
-
* @returns {number} the standard deviation of the specified array.
|
228
|
-
*/
|
229
|
-
pv.deviation = function(array, f) {
|
230
|
-
return Math.sqrt(pv.variance(array, f) / (array.length - 1));
|
231
|
-
};
|
232
|
-
|
233
|
-
/**
|
234
|
-
* Returns the logarithm with a given base value.
|
235
|
-
*
|
236
|
-
* @param {number} x the number for which to compute the logarithm.
|
237
|
-
* @param {number} b the base of the logarithm.
|
238
|
-
* @returns {number} the logarithm value.
|
239
|
-
*/
|
240
|
-
pv.log = function(x, b) {
|
241
|
-
return Math.log(x) / Math.log(b);
|
242
|
-
};
|
243
|
-
|
244
|
-
/**
|
245
|
-
* Computes a zero-symmetric logarithm. Computes the logarithm of the absolute
|
246
|
-
* value of the input, and determines the sign of the output according to the
|
247
|
-
* sign of the input value.
|
248
|
-
*
|
249
|
-
* @param {number} x the number for which to compute the logarithm.
|
250
|
-
* @param {number} b the base of the logarithm.
|
251
|
-
* @returns {number} the symmetric log value.
|
252
|
-
*/
|
253
|
-
pv.logSymmetric = function(x, b) {
|
254
|
-
return (x == 0) ? 0 : ((x < 0) ? -pv.log(-x, b) : pv.log(x, b));
|
255
|
-
};
|
256
|
-
|
257
|
-
/**
|
258
|
-
* Computes a zero-symmetric logarithm, with adjustment to values between zero
|
259
|
-
* and the logarithm base. This adjustment introduces distortion for values less
|
260
|
-
* than the base number, but enables simultaneous plotting of log-transformed
|
261
|
-
* data involving both positive and negative numbers.
|
262
|
-
*
|
263
|
-
* @param {number} x the number for which to compute the logarithm.
|
264
|
-
* @param {number} b the base of the logarithm.
|
265
|
-
* @returns {number} the adjusted, symmetric log value.
|
266
|
-
*/
|
267
|
-
pv.logAdjusted = function(x, b) {
|
268
|
-
if (!isFinite(x)) return x;
|
269
|
-
var negative = x < 0;
|
270
|
-
if (x < b) x += (b - x) / b;
|
271
|
-
return negative ? -pv.log(x, b) : pv.log(x, b);
|
272
|
-
};
|
273
|
-
|
274
|
-
/**
|
275
|
-
* Rounds an input value down according to its logarithm. The method takes the
|
276
|
-
* floor of the logarithm of the value and then uses the resulting value as an
|
277
|
-
* exponent for the base value.
|
278
|
-
*
|
279
|
-
* @param {number} x the number for which to compute the logarithm floor.
|
280
|
-
* @param {number} b the base of the logarithm.
|
281
|
-
* @returns {number} the rounded-by-logarithm value.
|
282
|
-
*/
|
283
|
-
pv.logFloor = function(x, b) {
|
284
|
-
return (x > 0)
|
285
|
-
? Math.pow(b, Math.floor(pv.log(x, b)))
|
286
|
-
: -Math.pow(b, -Math.floor(-pv.log(-x, b)));
|
287
|
-
};
|
288
|
-
|
289
|
-
/**
|
290
|
-
* Rounds an input value up according to its logarithm. The method takes the
|
291
|
-
* ceiling of the logarithm of the value and then uses the resulting value as an
|
292
|
-
* exponent for the base value.
|
293
|
-
*
|
294
|
-
* @param {number} x the number for which to compute the logarithm ceiling.
|
295
|
-
* @param {number} b the base of the logarithm.
|
296
|
-
* @returns {number} the rounded-by-logarithm value.
|
297
|
-
*/
|
298
|
-
pv.logCeil = function(x, b) {
|
299
|
-
return (x > 0)
|
300
|
-
? Math.pow(b, Math.ceil(pv.log(x, b)))
|
301
|
-
: -Math.pow(b, -Math.ceil(-pv.log(-x, b)));
|
302
|
-
};
|
303
|
-
|
304
|
-
(function() {
|
305
|
-
var radians = Math.PI / 180,
|
306
|
-
degrees = 180 / Math.PI;
|
307
|
-
|
308
|
-
/** Returns the number of radians corresponding to the specified degrees. */
|
309
|
-
pv.radians = function(degrees) { return radians * degrees; };
|
310
|
-
|
311
|
-
/** Returns the number of degrees corresponding to the specified radians. */
|
312
|
-
pv.degrees = function(radians) { return degrees * radians; };
|
313
|
-
})();
|