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,440 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns a default quantitative, linear, scale for the specified domain. The
|
|
3
|
-
* arguments to this constructor are optional, and equivalent to calling
|
|
4
|
-
* {@link #domain}. The default domain and range are [0,1].
|
|
5
|
-
*
|
|
6
|
-
* <p>This constructor is typically not used directly; see one of the
|
|
7
|
-
* quantitative scale implementations instead.
|
|
8
|
-
*
|
|
9
|
-
* @class Represents an abstract quantitative scale; a function that performs a
|
|
10
|
-
* numeric transformation. This class is typically not used directly; see one of
|
|
11
|
-
* the quantitative scale implementations (linear, log, root, etc.)
|
|
12
|
-
* instead. <style type="text/css">sub{line-height:0}</style> A quantitative
|
|
13
|
-
* scale represents a 1-dimensional transformation from a numeric domain of
|
|
14
|
-
* input data [<i>d<sub>0</sub></i>, <i>d<sub>1</sub></i>] to a numeric range of
|
|
15
|
-
* pixels [<i>r<sub>0</sub></i>, <i>r<sub>1</sub></i>]. In addition to
|
|
16
|
-
* readability, scales offer several useful features:
|
|
17
|
-
*
|
|
18
|
-
* <p>1. The range can be expressed in colors, rather than pixels. For example:
|
|
19
|
-
*
|
|
20
|
-
* <pre> .fillStyle(pv.Scale.linear(0, 100).range("red", "green"))</pre>
|
|
21
|
-
*
|
|
22
|
-
* will fill the marks "red" on an input value of 0, "green" on an input value
|
|
23
|
-
* of 100, and some color in-between for intermediate values.
|
|
24
|
-
*
|
|
25
|
-
* <p>2. The domain and range can be subdivided for a non-uniform
|
|
26
|
-
* transformation. For example, you may want a diverging color scale that is
|
|
27
|
-
* increasingly red for negative values, and increasingly green for positive
|
|
28
|
-
* values:
|
|
29
|
-
*
|
|
30
|
-
* <pre> .fillStyle(pv.Scale.linear(-1, 0, 1).range("red", "white", "green"))</pre>
|
|
31
|
-
*
|
|
32
|
-
* The domain can be specified as a series of <i>n</i> monotonically-increasing
|
|
33
|
-
* values; the range must also be specified as <i>n</i> values, resulting in
|
|
34
|
-
* <i>n - 1</i> contiguous linear scales.
|
|
35
|
-
*
|
|
36
|
-
* <p>3. Quantitative scales can be inverted for interaction. The
|
|
37
|
-
* {@link #invert} method takes a value in the output range, and returns the
|
|
38
|
-
* corresponding value in the input domain. This is frequently used to convert
|
|
39
|
-
* the mouse location (see {@link pv.Mark#mouse}) to a value in the input
|
|
40
|
-
* domain. Note that inversion is only supported for numeric ranges, and not
|
|
41
|
-
* colors.
|
|
42
|
-
*
|
|
43
|
-
* <p>4. A scale can be queried for reasonable "tick" values. The {@link #ticks}
|
|
44
|
-
* method provides a convenient way to get a series of evenly-spaced rounded
|
|
45
|
-
* values in the input domain. Frequently these are used in conjunction with
|
|
46
|
-
* {@link pv.Rule} to display tick marks or grid lines.
|
|
47
|
-
*
|
|
48
|
-
* <p>5. A scale can be "niced" to extend the domain to suitable rounded
|
|
49
|
-
* numbers. If the minimum and maximum of the domain are messy because they are
|
|
50
|
-
* derived from data, you can use {@link #nice} to round these values down and
|
|
51
|
-
* up to even numbers.
|
|
52
|
-
*
|
|
53
|
-
* @param {number...} domain... optional domain values.
|
|
54
|
-
* @see pv.Scale.linear
|
|
55
|
-
* @see pv.Scale.log
|
|
56
|
-
* @see pv.Scale.root
|
|
57
|
-
* @extends pv.Scale
|
|
58
|
-
*/
|
|
59
|
-
pv.Scale.quantitative = function() {
|
|
60
|
-
var d = [0, 1], // default domain
|
|
61
|
-
l = [0, 1], // default transformed domain
|
|
62
|
-
r = [0, 1], // default range
|
|
63
|
-
i = [pv.identity], // default interpolators
|
|
64
|
-
type = Number, // default type
|
|
65
|
-
n = false, // whether the domain is negative
|
|
66
|
-
f = pv.identity, // default forward transform
|
|
67
|
-
g = pv.identity, // default inverse transform
|
|
68
|
-
tickFormat = String; // default tick formatting function
|
|
69
|
-
|
|
70
|
-
/** @private */
|
|
71
|
-
function newDate(x) {
|
|
72
|
-
return new Date(x);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/** @private */
|
|
76
|
-
function scale(x) {
|
|
77
|
-
var j = pv.search(d, x);
|
|
78
|
-
if (j < 0) j = -j - 2;
|
|
79
|
-
j = Math.max(0, Math.min(i.length - 1, j));
|
|
80
|
-
return i[j]((f(x) - l[j]) / (l[j + 1] - l[j]));
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** @private */
|
|
84
|
-
scale.transform = function(forward, inverse) {
|
|
85
|
-
/** @ignore */ f = function(x) { return n ? -forward(-x) : forward(x); };
|
|
86
|
-
/** @ignore */ g = function(y) { return n ? -inverse(-y) : inverse(y); };
|
|
87
|
-
l = d.map(f);
|
|
88
|
-
return this;
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Sets or gets the input domain. This method can be invoked several ways:
|
|
93
|
-
*
|
|
94
|
-
* <p>1. <tt>domain(min, ..., max)</tt>
|
|
95
|
-
*
|
|
96
|
-
* <p>Specifying the domain as a series of numbers is the most explicit and
|
|
97
|
-
* recommended approach. Most commonly, two numbers are specified: the minimum
|
|
98
|
-
* and maximum value. However, for a diverging scale, or other subdivided
|
|
99
|
-
* non-uniform scales, multiple values can be specified. Values can be derived
|
|
100
|
-
* from data using {@link pv.min} and {@link pv.max}. For example:
|
|
101
|
-
*
|
|
102
|
-
* <pre> .domain(0, pv.max(array))</pre>
|
|
103
|
-
*
|
|
104
|
-
* An alternative method for deriving minimum and maximum values from data
|
|
105
|
-
* follows.
|
|
106
|
-
*
|
|
107
|
-
* <p>2. <tt>domain(array, minf, maxf)</tt>
|
|
108
|
-
*
|
|
109
|
-
* <p>When both the minimum and maximum value are derived from data, the
|
|
110
|
-
* arguments to the <tt>domain</tt> method can be specified as the array of
|
|
111
|
-
* data, followed by zero, one or two accessor functions. For example, if the
|
|
112
|
-
* array of data is just an array of numbers:
|
|
113
|
-
*
|
|
114
|
-
* <pre> .domain(array)</pre>
|
|
115
|
-
*
|
|
116
|
-
* On the other hand, if the array elements are objects representing stock
|
|
117
|
-
* values per day, and the domain should consider the stock's daily low and
|
|
118
|
-
* daily high:
|
|
119
|
-
*
|
|
120
|
-
* <pre> .domain(array, function(d) d.low, function(d) d.high)</pre>
|
|
121
|
-
*
|
|
122
|
-
* The first method of setting the domain is preferred because it is more
|
|
123
|
-
* explicit; setting the domain using this second method should be used only
|
|
124
|
-
* if brevity is required.
|
|
125
|
-
*
|
|
126
|
-
* <p>3. <tt>domain()</tt>
|
|
127
|
-
*
|
|
128
|
-
* <p>Invoking the <tt>domain</tt> method with no arguments returns the
|
|
129
|
-
* current domain as an array of numbers.
|
|
130
|
-
*
|
|
131
|
-
* @function
|
|
132
|
-
* @name pv.Scale.quantitative.prototype.domain
|
|
133
|
-
* @param {number...} domain... domain values.
|
|
134
|
-
* @returns {pv.Scale.quantitative} <tt>this</tt>, or the current domain.
|
|
135
|
-
*/
|
|
136
|
-
scale.domain = function(array, min, max) {
|
|
137
|
-
if (arguments.length) {
|
|
138
|
-
var o; // the object we use to infer the domain type
|
|
139
|
-
if (array instanceof Array) {
|
|
140
|
-
if (arguments.length < 2) min = pv.identity;
|
|
141
|
-
if (arguments.length < 3) max = min;
|
|
142
|
-
o = array.length && min(array[0]);
|
|
143
|
-
d = array.length ? [pv.min(array, min), pv.max(array, max)] : [];
|
|
144
|
-
} else {
|
|
145
|
-
o = array;
|
|
146
|
-
d = Array.prototype.slice.call(arguments).map(Number);
|
|
147
|
-
}
|
|
148
|
-
if (!d.length) d = [-Infinity, Infinity];
|
|
149
|
-
else if (d.length == 1) d = [d[0], d[0]];
|
|
150
|
-
n = (d[0] || d[d.length - 1]) < 0;
|
|
151
|
-
l = d.map(f);
|
|
152
|
-
type = (o instanceof Date) ? newDate : Number;
|
|
153
|
-
return this;
|
|
154
|
-
}
|
|
155
|
-
return d.map(type);
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Sets or gets the output range. This method can be invoked several ways:
|
|
160
|
-
*
|
|
161
|
-
* <p>1. <tt>range(min, ..., max)</tt>
|
|
162
|
-
*
|
|
163
|
-
* <p>The range may be specified as a series of numbers or colors. Most
|
|
164
|
-
* commonly, two numbers are specified: the minimum and maximum pixel values.
|
|
165
|
-
* For a color scale, values may be specified as {@link pv.Color}s or
|
|
166
|
-
* equivalent strings. For a diverging scale, or other subdivided non-uniform
|
|
167
|
-
* scales, multiple values can be specified. For example:
|
|
168
|
-
*
|
|
169
|
-
* <pre> .range("red", "white", "green")</pre>
|
|
170
|
-
*
|
|
171
|
-
* <p>Currently, only numbers and colors are supported as range values. The
|
|
172
|
-
* number of range values must exactly match the number of domain values, or
|
|
173
|
-
* the behavior of the scale is undefined.
|
|
174
|
-
*
|
|
175
|
-
* <p>2. <tt>range()</tt>
|
|
176
|
-
*
|
|
177
|
-
* <p>Invoking the <tt>range</tt> method with no arguments returns the current
|
|
178
|
-
* range as an array of numbers or colors.
|
|
179
|
-
*
|
|
180
|
-
* @function
|
|
181
|
-
* @name pv.Scale.quantitative.prototype.range
|
|
182
|
-
* @param {...} range... range values.
|
|
183
|
-
* @returns {pv.Scale.quantitative} <tt>this</tt>, or the current range.
|
|
184
|
-
*/
|
|
185
|
-
scale.range = function() {
|
|
186
|
-
if (arguments.length) {
|
|
187
|
-
r = Array.prototype.slice.call(arguments);
|
|
188
|
-
if (!r.length) r = [-Infinity, Infinity];
|
|
189
|
-
else if (r.length == 1) r = [r[0], r[0]];
|
|
190
|
-
i = [];
|
|
191
|
-
for (var j = 0; j < r.length - 1; j++) {
|
|
192
|
-
i.push(pv.Scale.interpolator(r[j], r[j + 1]));
|
|
193
|
-
}
|
|
194
|
-
return this;
|
|
195
|
-
}
|
|
196
|
-
return r;
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Inverts the specified value in the output range, returning the
|
|
201
|
-
* corresponding value in the input domain. This is frequently used to convert
|
|
202
|
-
* the mouse location (see {@link pv.Mark#mouse}) to a value in the input
|
|
203
|
-
* domain. Inversion is only supported for numeric ranges, and not colors.
|
|
204
|
-
*
|
|
205
|
-
* <p>Note that this method does not do any rounding or bounds checking. If
|
|
206
|
-
* the input domain is discrete (e.g., an array index), the returned value
|
|
207
|
-
* should be rounded. If the specified <tt>y</tt> value is outside the range,
|
|
208
|
-
* the returned value may be equivalently outside the input domain.
|
|
209
|
-
*
|
|
210
|
-
* @function
|
|
211
|
-
* @name pv.Scale.quantitative.prototype.invert
|
|
212
|
-
* @param {number} y a value in the output range (a pixel location).
|
|
213
|
-
* @returns {number} a value in the input domain.
|
|
214
|
-
*/
|
|
215
|
-
scale.invert = function(y) {
|
|
216
|
-
var j = pv.search(r, y);
|
|
217
|
-
if (j < 0) j = -j - 2;
|
|
218
|
-
j = Math.max(0, Math.min(i.length - 1, j));
|
|
219
|
-
return type(g(l[j] + (y - r[j]) / (r[j + 1] - r[j]) * (l[j + 1] - l[j])));
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Returns an array of evenly-spaced, suitably-rounded values in the input
|
|
224
|
-
* domain. This method attempts to return between 5 and 10 tick values. These
|
|
225
|
-
* values are frequently used in conjunction with {@link pv.Rule} to display
|
|
226
|
-
* tick marks or grid lines.
|
|
227
|
-
*
|
|
228
|
-
* @function
|
|
229
|
-
* @name pv.Scale.quantitative.prototype.ticks
|
|
230
|
-
* @param {number} [m] optional number of desired ticks.
|
|
231
|
-
* @returns {number[]} an array input domain values to use as ticks.
|
|
232
|
-
*/
|
|
233
|
-
scale.ticks = function(m) {
|
|
234
|
-
var start = d[0],
|
|
235
|
-
end = d[d.length - 1],
|
|
236
|
-
reverse = end < start,
|
|
237
|
-
min = reverse ? end : start,
|
|
238
|
-
max = reverse ? start : end,
|
|
239
|
-
span = max - min;
|
|
240
|
-
|
|
241
|
-
/* Special case: empty, invalid or infinite span. */
|
|
242
|
-
if (!span || !isFinite(span)) {
|
|
243
|
-
if (type == newDate) tickFormat = pv.Format.date("%x");
|
|
244
|
-
return [type(min)];
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/* Special case: dates. */
|
|
248
|
-
if (type == newDate) {
|
|
249
|
-
/* Floor the date d given the precision p. */
|
|
250
|
-
function floor(d, p) {
|
|
251
|
-
switch (p) {
|
|
252
|
-
case 31536e6: d.setMonth(0);
|
|
253
|
-
case 2592e6: d.setDate(1);
|
|
254
|
-
case 6048e5: if (p == 6048e5) d.setDate(d.getDate() - d.getDay());
|
|
255
|
-
case 864e5: d.setHours(0);
|
|
256
|
-
case 36e5: d.setMinutes(0);
|
|
257
|
-
case 6e4: d.setSeconds(0);
|
|
258
|
-
case 1e3: d.setMilliseconds(0);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
var precision, format, increment, step = 1;
|
|
263
|
-
if (span >= 3 * 31536e6) {
|
|
264
|
-
precision = 31536e6;
|
|
265
|
-
format = "%Y";
|
|
266
|
-
/** @ignore */ increment = function(d) { d.setFullYear(d.getFullYear() + step); };
|
|
267
|
-
} else if (span >= 3 * 2592e6) {
|
|
268
|
-
precision = 2592e6;
|
|
269
|
-
format = "%m/%Y";
|
|
270
|
-
/** @ignore */ increment = function(d) { d.setMonth(d.getMonth() + step); };
|
|
271
|
-
} else if (span >= 3 * 6048e5) {
|
|
272
|
-
precision = 6048e5;
|
|
273
|
-
format = "%m/%d";
|
|
274
|
-
/** @ignore */ increment = function(d) { d.setDate(d.getDate() + 7 * step); };
|
|
275
|
-
} else if (span >= 3 * 864e5) {
|
|
276
|
-
precision = 864e5;
|
|
277
|
-
format = "%m/%d";
|
|
278
|
-
/** @ignore */ increment = function(d) { d.setDate(d.getDate() + step); };
|
|
279
|
-
} else if (span >= 3 * 36e5) {
|
|
280
|
-
precision = 36e5;
|
|
281
|
-
format = "%I:%M %p";
|
|
282
|
-
/** @ignore */ increment = function(d) { d.setHours(d.getHours() + step); };
|
|
283
|
-
} else if (span >= 3 * 6e4) {
|
|
284
|
-
precision = 6e4;
|
|
285
|
-
format = "%I:%M %p";
|
|
286
|
-
/** @ignore */ increment = function(d) { d.setMinutes(d.getMinutes() + step); };
|
|
287
|
-
} else if (span >= 3 * 1e3) {
|
|
288
|
-
precision = 1e3;
|
|
289
|
-
format = "%I:%M:%S";
|
|
290
|
-
/** @ignore */ increment = function(d) { d.setSeconds(d.getSeconds() + step); };
|
|
291
|
-
} else {
|
|
292
|
-
precision = 1;
|
|
293
|
-
format = "%S.%Qs";
|
|
294
|
-
/** @ignore */ increment = function(d) { d.setTime(d.getTime() + step); };
|
|
295
|
-
}
|
|
296
|
-
tickFormat = pv.Format.date(format);
|
|
297
|
-
|
|
298
|
-
var date = new Date(min), dates = [];
|
|
299
|
-
floor(date, precision);
|
|
300
|
-
|
|
301
|
-
/* If we'd generate too many ticks, skip some!. */
|
|
302
|
-
var n = span / precision;
|
|
303
|
-
if (n > 10) {
|
|
304
|
-
switch (precision) {
|
|
305
|
-
case 36e5: {
|
|
306
|
-
step = (n > 20) ? 6 : 3;
|
|
307
|
-
date.setHours(Math.floor(date.getHours() / step) * step);
|
|
308
|
-
break;
|
|
309
|
-
}
|
|
310
|
-
case 2592e6: {
|
|
311
|
-
step = 3; // seasons
|
|
312
|
-
date.setMonth(Math.floor(date.getMonth() / step) * step);
|
|
313
|
-
break;
|
|
314
|
-
}
|
|
315
|
-
case 6e4: {
|
|
316
|
-
step = (n > 30) ? 15 : ((n > 15) ? 10 : 5);
|
|
317
|
-
date.setMinutes(Math.floor(date.getMinutes() / step) * step);
|
|
318
|
-
break;
|
|
319
|
-
}
|
|
320
|
-
case 1e3: {
|
|
321
|
-
step = (n > 90) ? 15 : ((n > 60) ? 10 : 5);
|
|
322
|
-
date.setSeconds(Math.floor(date.getSeconds() / step) * step);
|
|
323
|
-
break;
|
|
324
|
-
}
|
|
325
|
-
case 1: {
|
|
326
|
-
step = (n > 1000) ? 250 : ((n > 200) ? 100 : ((n > 100) ? 50 : ((n > 50) ? 25 : 5)));
|
|
327
|
-
date.setMilliseconds(Math.floor(date.getMilliseconds() / step) * step);
|
|
328
|
-
break;
|
|
329
|
-
}
|
|
330
|
-
default: {
|
|
331
|
-
step = pv.logCeil(n / 15, 10);
|
|
332
|
-
if (n / step < 2) step /= 5;
|
|
333
|
-
else if (n / step < 5) step /= 2;
|
|
334
|
-
date.setFullYear(Math.floor(date.getFullYear() / step) * step);
|
|
335
|
-
break;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
while (true) {
|
|
341
|
-
increment(date);
|
|
342
|
-
if (date > max) break;
|
|
343
|
-
dates.push(new Date(date));
|
|
344
|
-
}
|
|
345
|
-
return reverse ? dates.reverse() : dates;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
/* Normal case: numbers. */
|
|
349
|
-
if (!arguments.length) m = 10;
|
|
350
|
-
var step = pv.logFloor(span / m, 10),
|
|
351
|
-
err = m / (span / step);
|
|
352
|
-
if (err <= .15) step *= 10;
|
|
353
|
-
else if (err <= .35) step *= 5;
|
|
354
|
-
else if (err <= .75) step *= 2;
|
|
355
|
-
var start = Math.ceil(min / step) * step,
|
|
356
|
-
end = Math.floor(max / step) * step;
|
|
357
|
-
tickFormat = pv.Format.number()
|
|
358
|
-
.fractionDigits(Math.max(0, -Math.floor(pv.log(step, 10) + .01)));
|
|
359
|
-
var ticks = pv.range(start, end + step, step);
|
|
360
|
-
return reverse ? ticks.reverse() : ticks;
|
|
361
|
-
};
|
|
362
|
-
|
|
363
|
-
/**
|
|
364
|
-
* Formats the specified tick value using the appropriate precision, based on
|
|
365
|
-
* the step interval between tick marks. If {@link #ticks} has not been called,
|
|
366
|
-
* the argument is converted to a string, but no formatting is applied.
|
|
367
|
-
*
|
|
368
|
-
* @function
|
|
369
|
-
* @name pv.Scale.quantitative.prototype.tickFormat
|
|
370
|
-
* @param {number} t a tick value.
|
|
371
|
-
* @returns {string} a formatted tick value.
|
|
372
|
-
*/
|
|
373
|
-
scale.tickFormat = function (t) { return tickFormat(t); };
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* "Nices" this scale, extending the bounds of the input domain to
|
|
377
|
-
* evenly-rounded values. Nicing is useful if the domain is computed
|
|
378
|
-
* dynamically from data, and may be irregular. For example, given a domain of
|
|
379
|
-
* [0.20147987687960267, 0.996679553296417], a call to <tt>nice()</tt> might
|
|
380
|
-
* extend the domain to [0.2, 1].
|
|
381
|
-
*
|
|
382
|
-
* <p>This method must be invoked each time after setting the domain.
|
|
383
|
-
*
|
|
384
|
-
* @function
|
|
385
|
-
* @name pv.Scale.quantitative.prototype.nice
|
|
386
|
-
* @returns {pv.Scale.quantitative} <tt>this</tt>.
|
|
387
|
-
*/
|
|
388
|
-
scale.nice = function() {
|
|
389
|
-
if (d.length != 2) return this; // TODO support non-uniform domains
|
|
390
|
-
var start = d[0],
|
|
391
|
-
end = d[d.length - 1],
|
|
392
|
-
reverse = end < start,
|
|
393
|
-
min = reverse ? end : start,
|
|
394
|
-
max = reverse ? start : end,
|
|
395
|
-
span = max - min;
|
|
396
|
-
|
|
397
|
-
/* Special case: empty, invalid or infinite span. */
|
|
398
|
-
if (!span || !isFinite(span)) return this;
|
|
399
|
-
|
|
400
|
-
var step = Math.pow(10, Math.round(Math.log(span) / Math.log(10)) - 1);
|
|
401
|
-
d = [Math.floor(min / step) * step, Math.ceil(max / step) * step];
|
|
402
|
-
if (reverse) d.reverse();
|
|
403
|
-
l = d.map(f);
|
|
404
|
-
return this;
|
|
405
|
-
};
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
* Returns a view of this scale by the specified accessor function <tt>f</tt>.
|
|
409
|
-
* Given a scale <tt>y</tt>, <tt>y.by(function(d) d.foo)</tt> is equivalent to
|
|
410
|
-
* <tt>function(d) y(d.foo)</tt>.
|
|
411
|
-
*
|
|
412
|
-
* <p>This method is provided for convenience, such that scales can be
|
|
413
|
-
* succinctly defined inline. For example, given an array of data elements
|
|
414
|
-
* that have a <tt>score</tt> attribute with the domain [0, 1], the height
|
|
415
|
-
* property could be specified as:
|
|
416
|
-
*
|
|
417
|
-
* <pre> .height(pv.Scale.linear().range(0, 480).by(function(d) d.score))</pre>
|
|
418
|
-
*
|
|
419
|
-
* This is equivalent to:
|
|
420
|
-
*
|
|
421
|
-
* <pre> .height(function(d) d.score * 480)</pre>
|
|
422
|
-
*
|
|
423
|
-
* This method should be used judiciously; it is typically more clear to
|
|
424
|
-
* invoke the scale directly, passing in the value to be scaled.
|
|
425
|
-
*
|
|
426
|
-
* @function
|
|
427
|
-
* @name pv.Scale.quantitative.prototype.by
|
|
428
|
-
* @param {function} f an accessor function.
|
|
429
|
-
* @returns {pv.Scale.quantitative} a view of this scale by the specified
|
|
430
|
-
* accessor function.
|
|
431
|
-
*/
|
|
432
|
-
scale.by = function(f) {
|
|
433
|
-
function by() { return scale(f.apply(this, arguments)); }
|
|
434
|
-
for (var method in scale) by[method] = scale[method];
|
|
435
|
-
return by;
|
|
436
|
-
};
|
|
437
|
-
|
|
438
|
-
scale.domain.apply(scale, arguments);
|
|
439
|
-
return scale;
|
|
440
|
-
};
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns a root 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 root scale; a function that performs a power
|
|
7
|
-
* transformation. <style type="text/css">sub{line-height:0}</style> Most
|
|
8
|
-
* commonly, a root scale represents a 1-dimensional root transformation from a
|
|
9
|
-
* numeric domain of input data [<i>d<sub>0</sub></i>, <i>d<sub>1</sub></i>] to
|
|
10
|
-
* a numeric range of pixels [<i>r<sub>0</sub></i>, <i>r<sub>1</sub></i>].
|
|
11
|
-
*
|
|
12
|
-
* <p>Note that the scale is itself a function, and thus can be used as a
|
|
13
|
-
* property directly, assuming that the data associated with a mark is a
|
|
14
|
-
* number. While this is convenient for single-use scales, frequently it is
|
|
15
|
-
* desirable to define scales globally:
|
|
16
|
-
*
|
|
17
|
-
* <pre>var y = pv.Scale.root(0, 100).range(0, 640);</pre>
|
|
18
|
-
*
|
|
19
|
-
* The <tt>y</tt> scale can now be equivalently referenced within a property:
|
|
20
|
-
*
|
|
21
|
-
* <pre> .height(function(d) y(d))</pre>
|
|
22
|
-
*
|
|
23
|
-
* Alternatively, if the data are not simple numbers, the appropriate value can
|
|
24
|
-
* be passed to the <tt>y</tt> scale (e.g., <tt>d.foo</tt>). The {@link #by}
|
|
25
|
-
* method similarly allows the data to be mapped to a numeric value before
|
|
26
|
-
* performing the root transformation.
|
|
27
|
-
*
|
|
28
|
-
* @param {number...} domain... optional domain values.
|
|
29
|
-
* @extends pv.Scale.quantitative
|
|
30
|
-
*/
|
|
31
|
-
pv.Scale.root = function() {
|
|
32
|
-
var scale = pv.Scale.quantitative();
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Sets or gets the exponent; defaults to 2.
|
|
36
|
-
*
|
|
37
|
-
* @function
|
|
38
|
-
* @name pv.Scale.root.prototype.power
|
|
39
|
-
* @param {number} [v] the new exponent.
|
|
40
|
-
* @returns {pv.Scale.root} <tt>this</tt>, or the current base.
|
|
41
|
-
*/
|
|
42
|
-
scale.power = function(v) {
|
|
43
|
-
if (arguments.length) {
|
|
44
|
-
var b = Number(v), p = 1 / b;
|
|
45
|
-
scale.transform(
|
|
46
|
-
function(x) { return Math.pow(x, p); },
|
|
47
|
-
function(y) { return Math.pow(y, b); });
|
|
48
|
-
return this;
|
|
49
|
-
}
|
|
50
|
-
return b;
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
scale.domain.apply(scale, arguments);
|
|
54
|
-
return scale.power(2);
|
|
55
|
-
};
|