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,146 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Returns a {@link pv.Flatten} operator for the specified map. This is a
|
3
|
-
* convenience factory method, equivalent to <tt>new pv.Flatten(map)</tt>.
|
4
|
-
*
|
5
|
-
* @see pv.Flatten
|
6
|
-
* @param map a map to flatten.
|
7
|
-
* @returns {pv.Flatten} a flatten operator for the specified map.
|
8
|
-
*/
|
9
|
-
pv.flatten = function(map) {
|
10
|
-
return new pv.Flatten(map);
|
11
|
-
};
|
12
|
-
|
13
|
-
/**
|
14
|
-
* Constructs a flatten operator for the specified map. This constructor should
|
15
|
-
* not be invoked directly; use {@link pv.flatten} instead.
|
16
|
-
*
|
17
|
-
* @class Represents a flatten operator for the specified array. Flattening
|
18
|
-
* allows hierarchical maps to be flattened into an array. The levels in the
|
19
|
-
* input tree are specified by <i>key</i> functions.
|
20
|
-
*
|
21
|
-
* <p>For example, consider the following hierarchical data structure of Barley
|
22
|
-
* yields, from various sites in Minnesota during 1931-2:
|
23
|
-
*
|
24
|
-
* <pre>{ 1931: {
|
25
|
-
* Manchuria: {
|
26
|
-
* "University Farm": 27.00,
|
27
|
-
* "Waseca": 48.87,
|
28
|
-
* "Morris": 27.43,
|
29
|
-
* ... },
|
30
|
-
* Glabron: {
|
31
|
-
* "University Farm": 43.07,
|
32
|
-
* "Waseca": 55.20,
|
33
|
-
* ... } },
|
34
|
-
* 1932: {
|
35
|
-
* ... } }</pre>
|
36
|
-
*
|
37
|
-
* To facilitate visualization, it may be useful to flatten the tree into a
|
38
|
-
* tabular array:
|
39
|
-
*
|
40
|
-
* <pre>var array = pv.flatten(yields)
|
41
|
-
* .key("year")
|
42
|
-
* .key("variety")
|
43
|
-
* .key("site")
|
44
|
-
* .key("yield")
|
45
|
-
* .array();</pre>
|
46
|
-
*
|
47
|
-
* This returns an array of object elements. Each element in the array has
|
48
|
-
* attributes corresponding to this flatten operator's keys:
|
49
|
-
*
|
50
|
-
* <pre>{ site: "University Farm", variety: "Manchuria", year: 1931, yield: 27 },
|
51
|
-
* { site: "Waseca", variety: "Manchuria", year: 1931, yield: 48.87 },
|
52
|
-
* { site: "Morris", variety: "Manchuria", year: 1931, yield: 27.43 },
|
53
|
-
* { site: "University Farm", variety: "Glabron", year: 1931, yield: 43.07 },
|
54
|
-
* { site: "Waseca", variety: "Glabron", year: 1931, yield: 55.2 }, ...</pre>
|
55
|
-
*
|
56
|
-
* <p>The flatten operator is roughly the inverse of the {@link pv.Nest} and
|
57
|
-
* {@link pv.Tree} operators.
|
58
|
-
*
|
59
|
-
* @param map a map to flatten.
|
60
|
-
*/
|
61
|
-
pv.Flatten = function(map) {
|
62
|
-
this.map = map;
|
63
|
-
this.keys = [];
|
64
|
-
};
|
65
|
-
|
66
|
-
/**
|
67
|
-
* Flattens using the specified key function. Multiple keys may be added to the
|
68
|
-
* flatten; the tiers of the underlying tree must correspond to the specified
|
69
|
-
* keys, in order. The order of the returned array is undefined; however, you
|
70
|
-
* can easily sort it.
|
71
|
-
*
|
72
|
-
* @param {string} key the key name.
|
73
|
-
* @param {function} [f] an optional value map function.
|
74
|
-
* @returns {pv.Nest} this.
|
75
|
-
*/
|
76
|
-
pv.Flatten.prototype.key = function(key, f) {
|
77
|
-
this.keys.push({name: key, value: f});
|
78
|
-
delete this.$leaf;
|
79
|
-
return this;
|
80
|
-
};
|
81
|
-
|
82
|
-
/**
|
83
|
-
* Flattens using the specified leaf function. This is an alternative to
|
84
|
-
* specifying an explicit set of keys; the tiers of the underlying tree will be
|
85
|
-
* determined dynamically by recursing on the values, and the resulting keys
|
86
|
-
* will be stored in the entries <tt>keys</tt> attribute. The leaf function must
|
87
|
-
* return true for leaves, and false for internal nodes.
|
88
|
-
*
|
89
|
-
* @param {function} f a leaf function.
|
90
|
-
* @returns {pv.Nest} this.
|
91
|
-
*/
|
92
|
-
pv.Flatten.prototype.leaf = function(f) {
|
93
|
-
this.keys.length = 0;
|
94
|
-
this.$leaf = f;
|
95
|
-
return this;
|
96
|
-
};
|
97
|
-
|
98
|
-
/**
|
99
|
-
* Returns the flattened array. Each entry in the array is an object; each
|
100
|
-
* object has attributes corresponding to this flatten operator's keys.
|
101
|
-
*
|
102
|
-
* @returns an array of elements from the flattened map.
|
103
|
-
*/
|
104
|
-
pv.Flatten.prototype.array = function() {
|
105
|
-
var entries = [], stack = [], keys = this.keys, leaf = this.$leaf;
|
106
|
-
|
107
|
-
/* Recursively visit using the leaf function. */
|
108
|
-
if (leaf) {
|
109
|
-
function recurse(value, i) {
|
110
|
-
if (leaf(value)) {
|
111
|
-
entries.push({keys: stack.slice(), value: value});
|
112
|
-
} else {
|
113
|
-
for (var key in value) {
|
114
|
-
stack.push(key);
|
115
|
-
recurse(value[key], i + 1);
|
116
|
-
stack.pop();
|
117
|
-
}
|
118
|
-
}
|
119
|
-
}
|
120
|
-
recurse(this.map, 0);
|
121
|
-
return entries;
|
122
|
-
}
|
123
|
-
|
124
|
-
/* Recursively visits the specified value. */
|
125
|
-
function visit(value, i) {
|
126
|
-
if (i < keys.length - 1) {
|
127
|
-
for (var key in value) {
|
128
|
-
stack.push(key);
|
129
|
-
visit(value[key], i + 1);
|
130
|
-
stack.pop();
|
131
|
-
}
|
132
|
-
} else {
|
133
|
-
entries.push(stack.concat(value));
|
134
|
-
}
|
135
|
-
}
|
136
|
-
|
137
|
-
visit(this.map, 0);
|
138
|
-
return entries.map(function(stack) {
|
139
|
-
var m = {};
|
140
|
-
for (var i = 0; i < keys.length; i++) {
|
141
|
-
var k = keys[i], v = stack[i];
|
142
|
-
m[k.name] = k.value ? k.value.call(null, v) : v;
|
143
|
-
}
|
144
|
-
return m;
|
145
|
-
});
|
146
|
-
};
|
@@ -1,120 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Returns a histogram operator for the specified data, with an optional
|
3
|
-
* accessor function. If the data specified is not an array of numbers, an
|
4
|
-
* accessor function must be specified to map the data to numeric values.
|
5
|
-
*
|
6
|
-
* @class Represents a histogram operator.
|
7
|
-
*
|
8
|
-
* @param {array} data an array of numbers or objects.
|
9
|
-
* @param {function} [f] an optional accessor function.
|
10
|
-
*/
|
11
|
-
pv.histogram = function(data, f) {
|
12
|
-
var frequency = true;
|
13
|
-
return {
|
14
|
-
|
15
|
-
/**
|
16
|
-
* Returns the computed histogram bins. An optional array of numbers,
|
17
|
-
* <tt>ticks</tt>, may be specified as the break points. If the ticks are
|
18
|
-
* not specified, default ticks will be computed using a linear scale on the
|
19
|
-
* data domain.
|
20
|
-
*
|
21
|
-
* <p>The returned array contains {@link pv.histogram.Bin}s. The <tt>x</tt>
|
22
|
-
* attribute corresponds to the bin's start value (inclusive), while the
|
23
|
-
* <tt>dx</tt> attribute stores the bin size (end - start). The <tt>y</tt>
|
24
|
-
* attribute stores either the frequency count or probability, depending on
|
25
|
-
* how the histogram operator has been configured.
|
26
|
-
*
|
27
|
-
* <p>The {@link pv.histogram.Bin} objects are themselves arrays, containing
|
28
|
-
* the data elements present in each bin, i.e., the elements in the
|
29
|
-
* <tt>data</tt> array (prior to invoking the accessor function, if any).
|
30
|
-
* For example, if the data represented countries, and the accessor function
|
31
|
-
* returned the GDP of each country, the returned bins would be arrays of
|
32
|
-
* countries (not GDPs).
|
33
|
-
*
|
34
|
-
* @function
|
35
|
-
* @name pv.histogram.prototype.bins
|
36
|
-
* @param {array} [ticks]
|
37
|
-
* @returns {array}
|
38
|
-
*/ /** @private */
|
39
|
-
bins: function(ticks) {
|
40
|
-
var x = pv.map(data, f), bins = [];
|
41
|
-
|
42
|
-
/* Initialize default ticks. */
|
43
|
-
if (!arguments.length) ticks = pv.Scale.linear(x).ticks();
|
44
|
-
|
45
|
-
/* Initialize the bins. */
|
46
|
-
for (var i = 0; i < ticks.length - 1; i++) {
|
47
|
-
var bin = bins[i] = [];
|
48
|
-
bin.x = ticks[i];
|
49
|
-
bin.dx = ticks[i + 1] - ticks[i];
|
50
|
-
bin.y = 0;
|
51
|
-
}
|
52
|
-
|
53
|
-
/* Count the number of samples per bin. */
|
54
|
-
for (var i = 0; i < x.length; i++) {
|
55
|
-
var j = pv.search.index(ticks, x[i]) - 1,
|
56
|
-
bin = bins[Math.max(0, Math.min(bins.length - 1, j))];
|
57
|
-
bin.y++;
|
58
|
-
bin.push(data[i]);
|
59
|
-
}
|
60
|
-
|
61
|
-
/* Convert frequencies to probabilities. */
|
62
|
-
if (!frequency) for (var i = 0; i < bins.length; i++) {
|
63
|
-
bins[i].y /= x.length;
|
64
|
-
}
|
65
|
-
|
66
|
-
return bins;
|
67
|
-
},
|
68
|
-
|
69
|
-
/**
|
70
|
-
* Sets or gets whether this histogram operator returns frequencies or
|
71
|
-
* probabilities.
|
72
|
-
*
|
73
|
-
* @function
|
74
|
-
* @name pv.histogram.prototype.frequency
|
75
|
-
* @param {boolean} [x]
|
76
|
-
* @returns {pv.histogram} this.
|
77
|
-
*/ /** @private */
|
78
|
-
frequency: function(x) {
|
79
|
-
if (arguments.length) {
|
80
|
-
frequency = Boolean(x);
|
81
|
-
return this;
|
82
|
-
}
|
83
|
-
return frequency;
|
84
|
-
}
|
85
|
-
};
|
86
|
-
};
|
87
|
-
|
88
|
-
/**
|
89
|
-
* @class Represents a bin returned by the {@link pv.histogram} operator. Bins
|
90
|
-
* are themselves arrays containing the data elements present in the given bin
|
91
|
-
* (prior to the accessor function being invoked to convert the data object to a
|
92
|
-
* numeric value). These bin arrays have additional attributes with meta
|
93
|
-
* information about the bin.
|
94
|
-
*
|
95
|
-
* @name pv.histogram.Bin
|
96
|
-
* @extends array
|
97
|
-
* @see pv.histogram
|
98
|
-
*/
|
99
|
-
|
100
|
-
/**
|
101
|
-
* The start value of the bin's range.
|
102
|
-
*
|
103
|
-
* @type number
|
104
|
-
* @name pv.histogram.Bin.prototype.x
|
105
|
-
*/
|
106
|
-
|
107
|
-
/**
|
108
|
-
* The magnitude value of the bin's range; end - start.
|
109
|
-
*
|
110
|
-
* @type number
|
111
|
-
* @name pv.histogram.Bin.prototype.dx
|
112
|
-
*/
|
113
|
-
|
114
|
-
/**
|
115
|
-
* The frequency or probability of the bin, depending on how the histogram
|
116
|
-
* operator was configured.
|
117
|
-
*
|
118
|
-
* @type number
|
119
|
-
* @name pv.histogram.Bin.prototype.y
|
120
|
-
*/
|
@@ -1,54 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Returns a linear scale for the specified domain. The arguments to this
|
3
|
-
* constructor are optional, and equivalent to calling {@link #domain}.
|
4
|
-
* The default domain and range are [0,1].
|
5
|
-
*
|
6
|
-
* @class Represents a linear scale; a function that performs a linear
|
7
|
-
* transformation. <style type="text/css">sub{line-height:0}</style> Most
|
8
|
-
* commonly, a linear scale represents a 1-dimensional linear transformation
|
9
|
-
* from a numeric domain of input data [<i>d<sub>0</sub></i>,
|
10
|
-
* <i>d<sub>1</sub></i>] to a numeric range of pixels [<i>r<sub>0</sub></i>,
|
11
|
-
* <i>r<sub>1</sub></i>]. The equation for such a scale is:
|
12
|
-
*
|
13
|
-
* <blockquote><i>f(x) = (x - d<sub>0</sub>) / (d<sub>1</sub> - d<sub>0</sub>) *
|
14
|
-
* (r<sub>1</sub> - r<sub>0</sub>) + r<sub>0</sub></i></blockquote>
|
15
|
-
*
|
16
|
-
* For example, a linear scale from the domain [0, 100] to range [0, 640]:
|
17
|
-
*
|
18
|
-
* <blockquote><i>f(x) = (x - 0) / (100 - 0) * (640 - 0) + 0</i><br>
|
19
|
-
* <i>f(x) = x / 100 * 640</i><br>
|
20
|
-
* <i>f(x) = x * 6.4</i><br>
|
21
|
-
* </blockquote>
|
22
|
-
*
|
23
|
-
* Thus, saying
|
24
|
-
*
|
25
|
-
* <pre> .height(function(d) d * 6.4)</pre>
|
26
|
-
*
|
27
|
-
* is identical to
|
28
|
-
*
|
29
|
-
* <pre> .height(pv.Scale.linear(0, 100).range(0, 640))</pre>
|
30
|
-
*
|
31
|
-
* Note that the scale is itself a function, and thus can be used as a property
|
32
|
-
* directly, assuming that the data associated with a mark is a number. While
|
33
|
-
* this is convenient for single-use scales, frequently it is desirable to
|
34
|
-
* define scales globally:
|
35
|
-
*
|
36
|
-
* <pre>var y = pv.Scale.linear(0, 100).range(0, 640);</pre>
|
37
|
-
*
|
38
|
-
* The <tt>y</tt> scale can now be equivalently referenced within a property:
|
39
|
-
*
|
40
|
-
* <pre> .height(function(d) y(d))</pre>
|
41
|
-
*
|
42
|
-
* Alternatively, if the data are not simple numbers, the appropriate value can
|
43
|
-
* be passed to the <tt>y</tt> scale (e.g., <tt>d.foo</tt>). The {@link #by}
|
44
|
-
* method similarly allows the data to be mapped to a numeric value before
|
45
|
-
* performing the linear transformation.
|
46
|
-
*
|
47
|
-
* @param {number...} domain... optional domain values.
|
48
|
-
* @extends pv.Scale.quantitative
|
49
|
-
*/
|
50
|
-
pv.Scale.linear = function() {
|
51
|
-
var scale = pv.Scale.quantitative();
|
52
|
-
scale.domain.apply(scale, arguments);
|
53
|
-
return scale;
|
54
|
-
};
|
@@ -1,142 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Returns a log scale for the specified domain. The arguments to this
|
3
|
-
* constructor are optional, and equivalent to calling {@link #domain}.
|
4
|
-
* The default domain is [1,10] and the default range is [0,1].
|
5
|
-
*
|
6
|
-
* @class Represents a log scale. <style
|
7
|
-
* type="text/css">sub{line-height:0}</style> Most commonly, a log scale
|
8
|
-
* represents a 1-dimensional log transformation from a numeric domain of input
|
9
|
-
* data [<i>d<sub>0</sub></i>, <i>d<sub>1</sub></i>] to a numeric range of
|
10
|
-
* pixels [<i>r<sub>0</sub></i>, <i>r<sub>1</sub></i>]. The equation for such a
|
11
|
-
* scale is:
|
12
|
-
*
|
13
|
-
* <blockquote><i>f(x) = (log(x) - log(d<sub>0</sub>)) / (log(d<sub>1</sub>) -
|
14
|
-
* log(d<sub>0</sub>)) * (r<sub>1</sub> - r<sub>0</sub>) +
|
15
|
-
* r<sub>0</sub></i></blockquote>
|
16
|
-
*
|
17
|
-
* where <i>log(x)</i> represents the zero-symmetric logarthim of <i>x</i> using
|
18
|
-
* the scale's associated base (default: 10, see {@link pv.logSymmetric}). For
|
19
|
-
* example, a log scale from the domain [1, 100] to range [0, 640]:
|
20
|
-
*
|
21
|
-
* <blockquote><i>f(x) = (log(x) - log(1)) / (log(100) - log(1)) * (640 - 0) + 0</i><br>
|
22
|
-
* <i>f(x) = log(x) / 2 * 640</i><br>
|
23
|
-
* <i>f(x) = log(x) * 320</i><br>
|
24
|
-
* </blockquote>
|
25
|
-
*
|
26
|
-
* Thus, saying
|
27
|
-
*
|
28
|
-
* <pre> .height(function(d) Math.log(d) * 138.974)</pre>
|
29
|
-
*
|
30
|
-
* is equivalent to
|
31
|
-
*
|
32
|
-
* <pre> .height(pv.Scale.log(1, 100).range(0, 640))</pre>
|
33
|
-
*
|
34
|
-
* Note that the scale is itself a function, and thus can be used as a property
|
35
|
-
* directly, assuming that the data associated with a mark is a number. While
|
36
|
-
* this is convenient for single-use scales, frequently it is desirable to
|
37
|
-
* define scales globally:
|
38
|
-
*
|
39
|
-
* <pre>var y = pv.Scale.log(1, 100).range(0, 640);</pre>
|
40
|
-
*
|
41
|
-
* The <tt>y</tt> scale can now be equivalently referenced within a property:
|
42
|
-
*
|
43
|
-
* <pre> .height(function(d) y(d))</pre>
|
44
|
-
*
|
45
|
-
* Alternatively, if the data are not simple numbers, the appropriate value can
|
46
|
-
* be passed to the <tt>y</tt> scale (e.g., <tt>d.foo</tt>). The {@link #by}
|
47
|
-
* method similarly allows the data to be mapped to a numeric value before
|
48
|
-
* performing the log transformation.
|
49
|
-
*
|
50
|
-
* @param {number...} domain... optional domain values.
|
51
|
-
* @extends pv.Scale.quantitative
|
52
|
-
*/
|
53
|
-
pv.Scale.log = function() {
|
54
|
-
var scale = pv.Scale.quantitative(1, 10),
|
55
|
-
b, // logarithm base
|
56
|
-
p, // cached Math.log(b)
|
57
|
-
/** @ignore */ log = function(x) { return Math.log(x) / p; },
|
58
|
-
/** @ignore */ pow = function(y) { return Math.pow(b, y); };
|
59
|
-
|
60
|
-
/**
|
61
|
-
* Returns an array of evenly-spaced, suitably-rounded values in the input
|
62
|
-
* domain. These values are frequently used in conjunction with
|
63
|
-
* {@link pv.Rule} to display tick marks or grid lines.
|
64
|
-
*
|
65
|
-
* @function
|
66
|
-
* @name pv.Scale.log.prototype.ticks
|
67
|
-
* @returns {number[]} an array input domain values to use as ticks.
|
68
|
-
*/
|
69
|
-
scale.ticks = function() {
|
70
|
-
// TODO support non-uniform domains
|
71
|
-
var d = scale.domain(),
|
72
|
-
n = d[0] < 0,
|
73
|
-
i = Math.floor(n ? -log(-d[0]) : log(d[0])),
|
74
|
-
j = Math.ceil(n ? -log(-d[1]) : log(d[1])),
|
75
|
-
ticks = [];
|
76
|
-
if (n) {
|
77
|
-
ticks.push(-pow(-i));
|
78
|
-
for (; i++ < j;) for (var k = b - 1; k > 0; k--) ticks.push(-pow(-i) * k);
|
79
|
-
} else {
|
80
|
-
for (; i < j; i++) for (var k = 1; k < b; k++) ticks.push(pow(i) * k);
|
81
|
-
ticks.push(pow(i));
|
82
|
-
}
|
83
|
-
for (i = 0; ticks[i] < d[0]; i++); // strip small values
|
84
|
-
for (j = ticks.length; ticks[j - 1] > d[1]; j--); // strip big values
|
85
|
-
return ticks.slice(i, j);
|
86
|
-
};
|
87
|
-
|
88
|
-
/**
|
89
|
-
* Formats the specified tick value using the appropriate precision, assuming
|
90
|
-
* base 10.
|
91
|
-
*
|
92
|
-
* @function
|
93
|
-
* @name pv.Scale.log.prototype.tickFormat
|
94
|
-
* @param {number} t a tick value.
|
95
|
-
* @returns {string} a formatted tick value.
|
96
|
-
*/
|
97
|
-
scale.tickFormat = function(t) {
|
98
|
-
return t.toPrecision(1);
|
99
|
-
};
|
100
|
-
|
101
|
-
/**
|
102
|
-
* "Nices" this scale, extending the bounds of the input domain to
|
103
|
-
* evenly-rounded values. This method uses {@link pv.logFloor} and
|
104
|
-
* {@link pv.logCeil}. Nicing is useful if the domain is computed dynamically
|
105
|
-
* from data, and may be irregular. For example, given a domain of
|
106
|
-
* [0.20147987687960267, 0.996679553296417], a call to <tt>nice()</tt> might
|
107
|
-
* extend the domain to [0.1, 1].
|
108
|
-
*
|
109
|
-
* <p>This method must be invoked each time after setting the domain (and
|
110
|
-
* base).
|
111
|
-
*
|
112
|
-
* @function
|
113
|
-
* @name pv.Scale.log.prototype.nice
|
114
|
-
* @returns {pv.Scale.log} <tt>this</tt>.
|
115
|
-
*/
|
116
|
-
scale.nice = function() {
|
117
|
-
// TODO support non-uniform domains
|
118
|
-
var d = scale.domain();
|
119
|
-
return scale.domain(pv.logFloor(d[0], b), pv.logCeil(d[1], b));
|
120
|
-
};
|
121
|
-
|
122
|
-
/**
|
123
|
-
* Sets or gets the logarithm base. Defaults to 10.
|
124
|
-
*
|
125
|
-
* @function
|
126
|
-
* @name pv.Scale.log.prototype.base
|
127
|
-
* @param {number} [v] the new base.
|
128
|
-
* @returns {pv.Scale.log} <tt>this</tt>, or the current base.
|
129
|
-
*/
|
130
|
-
scale.base = function(v) {
|
131
|
-
if (arguments.length) {
|
132
|
-
b = Number(v);
|
133
|
-
p = Math.log(b);
|
134
|
-
scale.transform(log, pow); // update transformed domain
|
135
|
-
return this;
|
136
|
-
}
|
137
|
-
return b;
|
138
|
-
};
|
139
|
-
|
140
|
-
scale.domain.apply(scale, arguments);
|
141
|
-
return scale.base(10);
|
142
|
-
};
|