Skip to content

Commit 0607c58

Browse files
committed
Reduce code duplication.
I'm not totally sure about the nicing behavior for pow scales; we might want it to behave more like nicing for log scales. But this works for now!
1 parent 69324a4 commit 0607c58

7 files changed

Lines changed: 69 additions & 98 deletions

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ d3.core.js: \
7171

7272
d3.scale.js: \
7373
src/scale/scale.js \
74+
src/scale/nice.js \
7475
src/scale/linear.js \
7576
src/scale/bilinear.js \
7677
src/scale/polylinear.js \

d3.js

Lines changed: 33 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2128,6 +2128,27 @@ var d3_timer_frame = window.requestAnimationFrame
21282128
|| window.msRequestAnimationFrame
21292129
|| function(callback) { setTimeout(callback, 17); };
21302130
d3.scale = {};
2131+
function d3_scale_nice(domain, nice) {
2132+
var i0 = 0,
2133+
i1 = domain.length - 1,
2134+
x0 = domain[i0],
2135+
x1 = domain[i1],
2136+
dx;
2137+
2138+
if (x1 < x0) {
2139+
dx = i0; i0 = i1; i1 = dx;
2140+
dx = x0; x0 = x1; x1 = dx;
2141+
}
2142+
2143+
nice = nice(x1 - x0);
2144+
domain[i0] = nice.floor(x0);
2145+
domain[i1] = nice.ceil(x1);
2146+
return domain;
2147+
}
2148+
2149+
function d3_scale_niceDefault() {
2150+
return Math;
2151+
}
21312152
d3.scale.linear = function() {
21322153
var domain = [0, 1],
21332154
range = [0, 1],
@@ -2213,23 +2234,20 @@ d3.scale.linear = function() {
22132234
};
22142235

22152236
scale.nice = function() {
2216-
var last = domain.length - 1,
2217-
start = domain[0],
2218-
end = domain[last],
2219-
reverse = end < start,
2220-
min = reverse ? end : start,
2221-
max = reverse ? start : end,
2222-
span = max - min;
2223-
2224-
var step = Math.pow(10, Math.round(Math.log(span) / Math.log(10)) - 1);
2225-
domain[reverse ? last : 0] = Math.floor(min / step) * step;
2226-
domain[reverse ? 0 : last] = Math.ceil(max / step) * step;
2227-
2237+
d3_scale_nice(domain, d3_scale_linearNice);
22282238
return rescale();
22292239
};
22302240

22312241
return rescale();
22322242
};
2243+
2244+
function d3_scale_linearNice(dx) {
2245+
dx = Math.pow(10, Math.round(Math.log(dx) / Math.log(10)) - 1);
2246+
return {
2247+
floor: function(x) { return Math.floor(x / dx) * dx; },
2248+
ceil: function(x) { return Math.ceil(x / dx) * dx; },
2249+
};
2250+
}
22332251
function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
22342252
var u = uninterpolate(domain[0], domain[1]),
22352253
i = interpolate(range[0], range[1]);
@@ -2280,16 +2298,8 @@ d3.scale.log = function() {
22802298
scale.clamp = d3.rebind(scale, linear.clamp);
22812299

22822300
scale.nice = function() {
2283-
var domain = linear.domain().map(pow),
2284-
last = domain.length - 1,
2285-
start = domain[0],
2286-
end = domain[last],
2287-
reverse = end < start,
2288-
min = reverse ? end : start,
2289-
max = reverse ? start : end;
2290-
domain[reverse ? last : 0] = log.floor(min);
2291-
domain[reverse ? 0 : last] = log.ceil(max);
2292-
return scale.domain(domain);
2301+
linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault));
2302+
return scale;
22932303
};
22942304

22952305
scale.ticks = function() {
@@ -2336,22 +2346,6 @@ d3_scale_log.pow = function(x) {
23362346
d3_scale_logn.pow = function(x) {
23372347
return -Math.pow(10, -x);
23382348
};
2339-
2340-
d3_scale_log.floor = function(x) {
2341-
return d3_scale_log.pow(Math.floor(d3_scale_log(x)));
2342-
};
2343-
2344-
d3_scale_logn.floor = function(x) {
2345-
return d3_scale_logn.pow(Math.floor(d3_scale_logn(x)));
2346-
};
2347-
2348-
d3_scale_log.ceil = function(x) {
2349-
return d3_scale_log.pow(Math.ceil(d3_scale_log(x)));
2350-
};
2351-
2352-
d3_scale_logn.ceil = function(x) {
2353-
return d3_scale_logn.pow(Math.ceil(d3_scale_logn(x)));
2354-
};
23552349
d3.scale.pow = function() {
23562350
var linear = d3.scale.linear(),
23572351
tick = d3.scale.linear(), // TODO better tick formatting...
@@ -2385,16 +2379,7 @@ d3.scale.pow = function() {
23852379
scale.tickFormat = tick.tickFormat;
23862380

23872381
scale.nice = function() {
2388-
var domain = linear.domain().map(powb),
2389-
last = domain.length - 1,
2390-
start = domain[0],
2391-
end = domain[last],
2392-
reverse = end < start,
2393-
min = reverse ? end : start,
2394-
max = reverse ? start : end;
2395-
domain[reverse ? last : 0] = Math.floor(min);
2396-
domain[reverse ? 0 : last] = Math.ceil(max);
2397-
return scale.domain(domain);
2382+
return scale.domain(d3_scale_nice(scale.domain(), d3_scale_niceDefault));
23982383
};
23992384

24002385
scale.exponent = function(x) {

d3.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/scale/linear.js

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,20 +83,17 @@ d3.scale.linear = function() {
8383
};
8484

8585
scale.nice = function() {
86-
var last = domain.length - 1,
87-
start = domain[0],
88-
end = domain[last],
89-
reverse = end < start,
90-
min = reverse ? end : start,
91-
max = reverse ? start : end,
92-
span = max - min;
93-
94-
var step = Math.pow(10, Math.round(Math.log(span) / Math.log(10)) - 1);
95-
domain[reverse ? last : 0] = Math.floor(min / step) * step;
96-
domain[reverse ? 0 : last] = Math.ceil(max / step) * step;
97-
86+
d3_scale_nice(domain, d3_scale_linearNice);
9887
return rescale();
9988
};
10089

10190
return rescale();
10291
};
92+
93+
function d3_scale_linearNice(dx) {
94+
dx = Math.pow(10, Math.round(Math.log(dx) / Math.log(10)) - 1);
95+
return {
96+
floor: function(x) { return Math.floor(x / dx) * dx; },
97+
ceil: function(x) { return Math.ceil(x / dx) * dx; },
98+
};
99+
}

src/scale/log.js

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,8 @@ d3.scale.log = function() {
2525
scale.clamp = d3.rebind(scale, linear.clamp);
2626

2727
scale.nice = function() {
28-
var domain = linear.domain().map(pow),
29-
last = domain.length - 1,
30-
start = domain[0],
31-
end = domain[last],
32-
reverse = end < start,
33-
min = reverse ? end : start,
34-
max = reverse ? start : end;
35-
domain[reverse ? last : 0] = log.floor(min);
36-
domain[reverse ? 0 : last] = log.ceil(max);
37-
return scale.domain(domain);
28+
linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault));
29+
return scale;
3830
};
3931

4032
scale.ticks = function() {
@@ -81,19 +73,3 @@ d3_scale_log.pow = function(x) {
8173
d3_scale_logn.pow = function(x) {
8274
return -Math.pow(10, -x);
8375
};
84-
85-
d3_scale_log.floor = function(x) {
86-
return d3_scale_log.pow(Math.floor(d3_scale_log(x)));
87-
};
88-
89-
d3_scale_logn.floor = function(x) {
90-
return d3_scale_logn.pow(Math.floor(d3_scale_logn(x)));
91-
};
92-
93-
d3_scale_log.ceil = function(x) {
94-
return d3_scale_log.pow(Math.ceil(d3_scale_log(x)));
95-
};
96-
97-
d3_scale_logn.ceil = function(x) {
98-
return d3_scale_logn.pow(Math.ceil(d3_scale_logn(x)));
99-
};

src/scale/nice.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
function d3_scale_nice(domain, nice) {
2+
var i0 = 0,
3+
i1 = domain.length - 1,
4+
x0 = domain[i0],
5+
x1 = domain[i1],
6+
dx;
7+
8+
if (x1 < x0) {
9+
dx = i0; i0 = i1; i1 = dx;
10+
dx = x0; x0 = x1; x1 = dx;
11+
}
12+
13+
nice = nice(x1 - x0);
14+
domain[i0] = nice.floor(x0);
15+
domain[i1] = nice.ceil(x1);
16+
return domain;
17+
}
18+
19+
function d3_scale_niceDefault() {
20+
return Math;
21+
}

src/scale/pow.js

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,7 @@ d3.scale.pow = function() {
3131
scale.tickFormat = tick.tickFormat;
3232

3333
scale.nice = function() {
34-
var domain = linear.domain().map(powb),
35-
last = domain.length - 1,
36-
start = domain[0],
37-
end = domain[last],
38-
reverse = end < start,
39-
min = reverse ? end : start,
40-
max = reverse ? start : end;
41-
domain[reverse ? last : 0] = Math.floor(min);
42-
domain[reverse ? 0 : last] = Math.ceil(max);
43-
return scale.domain(domain);
34+
return scale.domain(d3_scale_nice(scale.domain(), d3_scale_niceDefault));
4435
};
4536

4637
scale.exponent = function(x) {

0 commit comments

Comments
 (0)