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,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
|
-
};
|