rubyvis 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.travis.yml +13 -0
  4. data/Gemfile +8 -0
  5. data/Gemfile.lock +37 -0
  6. data/History.txt +6 -0
  7. data/LICENSE.txt +23 -0
  8. data/{README.txt → README.md} +15 -12
  9. data/Rakefile +4 -11
  10. data/lib/rubyvis.rb +1 -1
  11. data/lib/rubyvis/scale/quantitative.rb +14 -18
  12. data/lib/rubyvis/scene/svg_label.rb +1 -1
  13. data/rubyvis.gemspec +21 -0
  14. data/spec/anchor_spec.rb +2 -1
  15. data/spec/line_spec.rb +2 -2
  16. data/spec/scale_linear_datetime_spec.rb +23 -8
  17. data/spec/spec_helper.rb +2 -1
  18. metadata +31 -214
  19. data/.gemtest +0 -0
  20. data/vendor/protovis/protovis-r3.3.js +0 -287
  21. data/vendor/protovis/src/behavior/Behavior.js +0 -32
  22. data/vendor/protovis/src/behavior/Drag.js +0 -112
  23. data/vendor/protovis/src/behavior/Pan.js +0 -110
  24. data/vendor/protovis/src/behavior/Point.js +0 -157
  25. data/vendor/protovis/src/behavior/Resize.js +0 -104
  26. data/vendor/protovis/src/behavior/Select.js +0 -100
  27. data/vendor/protovis/src/behavior/Zoom.js +0 -85
  28. data/vendor/protovis/src/color/Color.js +0 -598
  29. data/vendor/protovis/src/color/Colors.js +0 -135
  30. data/vendor/protovis/src/color/Ramp.js +0 -17
  31. data/vendor/protovis/src/data/Arrays.js +0 -277
  32. data/vendor/protovis/src/data/Dom.js +0 -380
  33. data/vendor/protovis/src/data/Flatten.js +0 -146
  34. data/vendor/protovis/src/data/Histogram.js +0 -120
  35. data/vendor/protovis/src/data/LinearScale.js +0 -54
  36. data/vendor/protovis/src/data/LogScale.js +0 -142
  37. data/vendor/protovis/src/data/Nest.js +0 -257
  38. data/vendor/protovis/src/data/Numbers.js +0 -313
  39. data/vendor/protovis/src/data/Objects.js +0 -78
  40. data/vendor/protovis/src/data/OrdinalScale.js +0 -267
  41. data/vendor/protovis/src/data/QuantileScale.js +0 -180
  42. data/vendor/protovis/src/data/QuantitativeScale.js +0 -440
  43. data/vendor/protovis/src/data/RootScale.js +0 -55
  44. data/vendor/protovis/src/data/Scale.js +0 -86
  45. data/vendor/protovis/src/data/Transform.js +0 -109
  46. data/vendor/protovis/src/data/Tree.js +0 -124
  47. data/vendor/protovis/src/data/Vector.js +0 -118
  48. data/vendor/protovis/src/geo/Geo.js +0 -5
  49. data/vendor/protovis/src/geo/GeoScale.js +0 -307
  50. data/vendor/protovis/src/geo/LatLng.js +0 -23
  51. data/vendor/protovis/src/geo/Projection.js +0 -43
  52. data/vendor/protovis/src/geo/Projections.js +0 -117
  53. data/vendor/protovis/src/lang/Array.js +0 -112
  54. data/vendor/protovis/src/lang/init.js +0 -26
  55. data/vendor/protovis/src/layout/Arc.js +0 -178
  56. data/vendor/protovis/src/layout/Bullet.js +0 -164
  57. data/vendor/protovis/src/layout/Cluster.js +0 -205
  58. data/vendor/protovis/src/layout/Force.js +0 -309
  59. data/vendor/protovis/src/layout/Grid.js +0 -119
  60. data/vendor/protovis/src/layout/Hierarchy.js +0 -249
  61. data/vendor/protovis/src/layout/Horizon.js +0 -159
  62. data/vendor/protovis/src/layout/Indent.js +0 -83
  63. data/vendor/protovis/src/layout/Layout.js +0 -56
  64. data/vendor/protovis/src/layout/Matrix.js +0 -177
  65. data/vendor/protovis/src/layout/Network.js +0 -302
  66. data/vendor/protovis/src/layout/Pack.js +0 -323
  67. data/vendor/protovis/src/layout/Partition.js +0 -203
  68. data/vendor/protovis/src/layout/Rollup.js +0 -203
  69. data/vendor/protovis/src/layout/Stack.js +0 -391
  70. data/vendor/protovis/src/layout/Tree.js +0 -282
  71. data/vendor/protovis/src/layout/Treemap.js +0 -347
  72. data/vendor/protovis/src/mark/Anchor.js +0 -81
  73. data/vendor/protovis/src/mark/Area.js +0 -268
  74. data/vendor/protovis/src/mark/Bar.js +0 -93
  75. data/vendor/protovis/src/mark/Dot.js +0 -212
  76. data/vendor/protovis/src/mark/Ease.js +0 -150
  77. data/vendor/protovis/src/mark/Image.js +0 -154
  78. data/vendor/protovis/src/mark/Label.js +0 -155
  79. data/vendor/protovis/src/mark/Line.js +0 -195
  80. data/vendor/protovis/src/mark/Mark.js +0 -1237
  81. data/vendor/protovis/src/mark/Panel.js +0 -273
  82. data/vendor/protovis/src/mark/Rule.js +0 -143
  83. data/vendor/protovis/src/mark/Transient.js +0 -7
  84. data/vendor/protovis/src/mark/Transition.js +0 -195
  85. data/vendor/protovis/src/mark/Wedge.js +0 -244
  86. data/vendor/protovis/src/physics/BoundConstraint.js +0 -75
  87. data/vendor/protovis/src/physics/ChargeForce.js +0 -184
  88. data/vendor/protovis/src/physics/CollisionConstraint.js +0 -113
  89. data/vendor/protovis/src/physics/Constraint.js +0 -26
  90. data/vendor/protovis/src/physics/DragForce.js +0 -49
  91. data/vendor/protovis/src/physics/Force.js +0 -25
  92. data/vendor/protovis/src/physics/Particle.js +0 -81
  93. data/vendor/protovis/src/physics/PositionConstraint.js +0 -72
  94. data/vendor/protovis/src/physics/Quadtree.js +0 -195
  95. data/vendor/protovis/src/physics/Simulation.js +0 -159
  96. data/vendor/protovis/src/physics/SpringForce.js +0 -141
  97. data/vendor/protovis/src/pv-internals.js +0 -154
  98. data/vendor/protovis/src/pv.js +0 -95
  99. data/vendor/protovis/src/scene/SvgArea.js +0 -172
  100. data/vendor/protovis/src/scene/SvgBar.js +0 -28
  101. data/vendor/protovis/src/scene/SvgCurve.js +0 -354
  102. data/vendor/protovis/src/scene/SvgDot.js +0 -81
  103. data/vendor/protovis/src/scene/SvgImage.js +0 -45
  104. data/vendor/protovis/src/scene/SvgLabel.js +0 -46
  105. data/vendor/protovis/src/scene/SvgLine.js +0 -159
  106. data/vendor/protovis/src/scene/SvgPanel.js +0 -126
  107. data/vendor/protovis/src/scene/SvgRule.js +0 -26
  108. data/vendor/protovis/src/scene/SvgScene.js +0 -185
  109. data/vendor/protovis/src/scene/SvgWedge.js +0 -66
  110. data/vendor/protovis/src/text/DateFormat.js +0 -262
  111. data/vendor/protovis/src/text/Format.js +0 -78
  112. data/vendor/protovis/src/text/NumberFormat.js +0 -227
  113. 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
- };