Skip to content

Commit 7590713

Browse files
committed
Fix d3#66 - setting domain recomputes range.
1 parent 2c52c37 commit 7590713

7 files changed

Lines changed: 206 additions & 44 deletions

File tree

Makefile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ d3.core.js: \
7171
src/core/hsl.js \
7272
src/core/selection.js \
7373
src/core/transition.js \
74-
src/core/timer.js
74+
src/core/timer.js \
75+
src/core/noop.js
7576

7677
d3.scale.js: \
7778
src/scale/scale.js \
@@ -229,7 +230,8 @@ test/scale: \
229230
test/scale/test-polylinear.test \
230231
test/scale/test-pow.test \
231232
test/scale/test-quantile.test \
232-
test/scale/test-sqrt.test
233+
test/scale/test-sqrt.test \
234+
test/scale/test-ordinal.test
233235

234236
test/svg: \
235237
test/svg/test-arc.test \

d3.js

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2178,6 +2178,7 @@ var d3_timer_frame = window.requestAnimationFrame
21782178
|| window.oRequestAnimationFrame
21792179
|| window.msRequestAnimationFrame
21802180
|| function(callback) { setTimeout(callback, 17); };
2181+
function d3_noop() {}
21812182
d3.scale = {};
21822183

21832184
function d3_scaleExtent(domain) {
@@ -2476,7 +2477,8 @@ d3.scale.ordinal = function() {
24762477
var domain = [],
24772478
index = {},
24782479
range = [],
2479-
rangeBand = 0;
2480+
rangeBand = 0,
2481+
rerange = d3_noop;
24802482

24812483
function scale(x) {
24822484
var i = x in index ? index[x] : (index[x] = domain.push(x) - 1);
@@ -2491,46 +2493,54 @@ d3.scale.ordinal = function() {
24912493
x = domain[i];
24922494
if (!(x in index)) index[x] = ++j;
24932495
}
2496+
rerange();
24942497
return scale;
24952498
};
24962499

24972500
scale.range = function(x) {
24982501
if (!arguments.length) return range;
24992502
range = x;
2503+
rerange = d3_noop;
25002504
return scale;
25012505
};
25022506

25032507
scale.rangePoints = function(x, padding) {
25042508
if (arguments.length < 2) padding = 0;
2505-
var start = x[0],
2506-
stop = x[1],
2507-
step = (stop - start) / (domain.length - 1 + padding);
2508-
range = domain.length == 1
2509-
? [(start + stop) / 2]
2510-
: d3.range(start + step * padding / 2, stop + step / 2, step);
2511-
rangeBand = 0;
2509+
(rerange = function() {
2510+
var start = x[0],
2511+
stop = x[1],
2512+
step = (stop - start) / (domain.length - 1 + padding);
2513+
range = domain.length == 1
2514+
? [(start + stop) / 2]
2515+
: d3.range(start + step * padding / 2, stop + step / 2, step);
2516+
rangeBand = 0;
2517+
})();
25122518
return scale;
25132519
};
25142520

25152521
scale.rangeBands = function(x, padding) {
25162522
if (arguments.length < 2) padding = 0;
2517-
var start = x[0],
2518-
stop = x[1],
2519-
step = (stop - start) / (domain.length + padding);
2520-
range = d3.range(start + step * padding, stop, step);
2521-
rangeBand = step * (1 - padding);
2523+
(rerange = function() {
2524+
var start = x[0],
2525+
stop = x[1],
2526+
step = (stop - start) / (domain.length + padding);
2527+
range = d3.range(start + step * padding, stop, step);
2528+
rangeBand = step * (1 - padding);
2529+
})();
25222530
return scale;
25232531
};
25242532

25252533
scale.rangeRoundBands = function(x, padding) {
25262534
if (arguments.length < 2) padding = 0;
2527-
var start = x[0],
2528-
stop = x[1],
2529-
diff = stop - start,
2530-
step = Math.floor(diff / (domain.length + padding)),
2531-
err = diff - (domain.length - padding) * step;
2532-
range = d3.range(start + Math.round(err / 2), stop, step);
2533-
rangeBand = Math.round(step * (1 - padding));
2535+
(rerange = function() {
2536+
var start = x[0],
2537+
stop = x[1],
2538+
diff = stop - start,
2539+
step = Math.floor(diff / (domain.length + padding)),
2540+
err = diff - (domain.length - padding) * step;
2541+
range = d3.range(start + Math.round(err / 2), stop, step);
2542+
rangeBand = Math.round(step * (1 - padding));
2543+
})();
25342544
return scale;
25352545
};
25362546

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/core/noop.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
function d3_noop() {}

src/scale/ordinal.js

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ d3.scale.ordinal = function() {
22
var domain = [],
33
index = {},
44
range = [],
5-
rangeBand = 0;
5+
rangeBand = 0,
6+
rerange = d3_noop;
67

78
function scale(x) {
89
var i = x in index ? index[x] : (index[x] = domain.push(x) - 1);
@@ -17,46 +18,54 @@ d3.scale.ordinal = function() {
1718
x = domain[i];
1819
if (!(x in index)) index[x] = ++j;
1920
}
21+
rerange();
2022
return scale;
2123
};
2224

2325
scale.range = function(x) {
2426
if (!arguments.length) return range;
2527
range = x;
28+
rerange = d3_noop;
2629
return scale;
2730
};
2831

2932
scale.rangePoints = function(x, padding) {
3033
if (arguments.length < 2) padding = 0;
31-
var start = x[0],
32-
stop = x[1],
33-
step = (stop - start) / (domain.length - 1 + padding);
34-
range = domain.length == 1
35-
? [(start + stop) / 2]
36-
: d3.range(start + step * padding / 2, stop + step / 2, step);
37-
rangeBand = 0;
34+
(rerange = function() {
35+
var start = x[0],
36+
stop = x[1],
37+
step = (stop - start) / (domain.length - 1 + padding);
38+
range = domain.length == 1
39+
? [(start + stop) / 2]
40+
: d3.range(start + step * padding / 2, stop + step / 2, step);
41+
rangeBand = 0;
42+
})();
3843
return scale;
3944
};
4045

4146
scale.rangeBands = function(x, padding) {
4247
if (arguments.length < 2) padding = 0;
43-
var start = x[0],
44-
stop = x[1],
45-
step = (stop - start) / (domain.length + padding);
46-
range = d3.range(start + step * padding, stop, step);
47-
rangeBand = step * (1 - padding);
48+
(rerange = function() {
49+
var start = x[0],
50+
stop = x[1],
51+
step = (stop - start) / (domain.length + padding);
52+
range = d3.range(start + step * padding, stop, step);
53+
rangeBand = step * (1 - padding);
54+
})();
4855
return scale;
4956
};
5057

5158
scale.rangeRoundBands = function(x, padding) {
5259
if (arguments.length < 2) padding = 0;
53-
var start = x[0],
54-
stop = x[1],
55-
diff = stop - start,
56-
step = Math.floor(diff / (domain.length + padding)),
57-
err = diff - (domain.length - padding) * step;
58-
range = d3.range(start + Math.round(err / 2), stop, step);
59-
rangeBand = Math.round(step * (1 - padding));
60+
(rerange = function() {
61+
var start = x[0],
62+
stop = x[1],
63+
diff = stop - start,
64+
step = Math.floor(diff / (domain.length + padding)),
65+
err = diff - (domain.length - padding) * step;
66+
range = d3.range(start + Math.round(err / 2), stop, step);
67+
rangeBand = Math.round(step * (1 - padding));
68+
})();
6069
return scale;
6170
};
6271

test/scale/test-ordinal.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
require("./../../lib/env-js/envjs/node");
2+
require("./../../d3");
3+
4+
var x = d3.scale.ordinal().range(["a", "b", "c"]);
5+
console.log("range([a, b, c]):");
6+
console.log(" 0 -> " + x(0));
7+
console.log(" 1 -> " + x(1));
8+
console.log(" 2 -> " + x(2));
9+
console.log(" 3 -> " + x(3));
10+
console.log(" 4 -> " + x(4));
11+
console.log(" 5 -> " + x(5));
12+
console.log(" 6 -> " + x(6));
13+
console.log(" 0 -> " + x(0));
14+
console.log(" 1 -> " + x(1));
15+
console.log(" 2 -> " + x(2));
16+
console.log(" 3 -> " + x(3));
17+
console.log("");
18+
19+
x.domain([]);
20+
console.log("domain([]).range([a, b, c]):");
21+
console.log(" 1 -> " + x(1));
22+
console.log(" 2 -> " + x(2));
23+
console.log(" 3 -> " + x(3));
24+
console.log(" 0 -> " + x(0));
25+
console.log(" 1 -> " + x(1));
26+
console.log(" 2 -> " + x(2));
27+
console.log("");
28+
29+
var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangePoints([0, 120]);
30+
console.log("domain([a, b, c]).rangePoints([0, 120]):");
31+
console.log(" a -> " + x("a"));
32+
console.log(" b -> " + x("b"));
33+
console.log(" c -> " + x("c"));
34+
console.log(" d -> " + x("d"));
35+
console.log("");
36+
37+
var x = d3.scale.ordinal().rangePoints([0, 120]).domain(["a", "b", "c"]);
38+
console.log("rangePoints([0, 120]).domain([a, b, c]):");
39+
console.log(" a -> " + x("a"));
40+
console.log(" b -> " + x("b"));
41+
console.log(" c -> " + x("c"));
42+
console.log(" d -> " + x("d"));
43+
console.log("");
44+
45+
var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangeBands([0, 120]);
46+
console.log("domain([a, b, c]).rangeBands([0, 120]):");
47+
console.log(" rangeBand: " + x.rangeBand());
48+
console.log(" a -> " + x("a"));
49+
console.log(" b -> " + x("b"));
50+
console.log(" c -> " + x("c"));
51+
console.log(" d -> " + x("d"));
52+
console.log("");
53+
54+
var x = d3.scale.ordinal().rangeBands([0, 120]).domain(["a", "b", "c"]);
55+
console.log("rangeBands([0, 120]).domain([a, b, c]):");
56+
console.log(" rangeBand: " + x.rangeBand());
57+
console.log(" a -> " + x("a"));
58+
console.log(" b -> " + x("b"));
59+
console.log(" c -> " + x("c"));
60+
console.log(" d -> " + x("d"));
61+
console.log("");
62+
63+
var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangeRoundBands([0, 119]);
64+
console.log("domain([a, b, c]).rangeRoundBands([0, 119]):");
65+
console.log(" rangeBand: " + x.rangeBand());
66+
console.log(" a -> " + x("a"));
67+
console.log(" b -> " + x("b"));
68+
console.log(" c -> " + x("c"));
69+
console.log(" d -> " + x("d"));
70+
console.log("");
71+
72+
var x = d3.scale.ordinal().rangeRoundBands([0, 119]).domain(["a", "b", "c"]);
73+
console.log("rangeRoundBands([0, 119]).domain([a, b, c]):");
74+
console.log(" rangeBand: " + x.rangeBand());
75+
console.log(" a -> " + x("a"));
76+
console.log(" b -> " + x("b"));
77+
console.log(" c -> " + x("c"));
78+
console.log(" d -> " + x("d"));
79+
console.log("");

test/scale/test-ordinal.out

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
range([a, b, c]):
2+
0 -> a
3+
1 -> b
4+
2 -> c
5+
3 -> a
6+
4 -> b
7+
5 -> c
8+
6 -> a
9+
0 -> a
10+
1 -> b
11+
2 -> c
12+
3 -> a
13+
14+
domain([]).range([a, b, c]):
15+
1 -> a
16+
2 -> b
17+
3 -> c
18+
0 -> a
19+
1 -> a
20+
2 -> b
21+
22+
domain([a, b, c]).rangePoints([0, 120]):
23+
a -> 0
24+
b -> 60
25+
c -> 120
26+
d -> 0
27+
28+
rangePoints([0, 120]).domain([a, b, c]):
29+
a -> 0
30+
b -> 60
31+
c -> 120
32+
d -> 0
33+
34+
domain([a, b, c]).rangeBands([0, 120]):
35+
rangeBand: 40
36+
a -> 0
37+
b -> 40
38+
c -> 80
39+
d -> 0
40+
41+
rangeBands([0, 120]).domain([a, b, c]):
42+
rangeBand: 40
43+
a -> 0
44+
b -> 40
45+
c -> 80
46+
d -> 0
47+
48+
domain([a, b, c]).rangeRoundBands([0, 119]):
49+
rangeBand: 39
50+
a -> 1
51+
b -> 40
52+
c -> 79
53+
d -> 118
54+
55+
rangeRoundBands([0, 119]).domain([a, b, c]):
56+
rangeBand: 39
57+
a -> 1
58+
b -> 40
59+
c -> 79
60+
d -> 118
61+

0 commit comments

Comments
 (0)