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