Skip to content

Commit

Permalink
Fix #66 - setting domain recomputes range.
Browse files Browse the repository at this point in the history
  • Loading branch information
mbostock committed Aug 1, 2011
1 parent 2c52c37 commit 7590713
Show file tree
Hide file tree
Showing 7 changed files with 206 additions and 44 deletions.
6 changes: 4 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ d3.core.js: \
src/core/hsl.js \
src/core/selection.js \
src/core/transition.js \
src/core/timer.js
src/core/timer.js \
src/core/noop.js

d3.scale.js: \
src/scale/scale.js \
Expand Down Expand Up @@ -229,7 +230,8 @@ test/scale: \
test/scale/test-polylinear.test \
test/scale/test-pow.test \
test/scale/test-quantile.test \
test/scale/test-sqrt.test
test/scale/test-sqrt.test \
test/scale/test-ordinal.test

test/svg: \
test/svg/test-arc.test \
Expand Down
50 changes: 30 additions & 20 deletions d3.js
Original file line number Diff line number Diff line change
Expand Up @@ -2178,6 +2178,7 @@ var d3_timer_frame = window.requestAnimationFrame
|| window.oRequestAnimationFrame
|| window.msRequestAnimationFrame
|| function(callback) { setTimeout(callback, 17); };
function d3_noop() {}
d3.scale = {};

function d3_scaleExtent(domain) {
Expand Down Expand Up @@ -2476,7 +2477,8 @@ d3.scale.ordinal = function() {
var domain = [],
index = {},
range = [],
rangeBand = 0;
rangeBand = 0,
rerange = d3_noop;

function scale(x) {
var i = x in index ? index[x] : (index[x] = domain.push(x) - 1);
Expand All @@ -2491,46 +2493,54 @@ d3.scale.ordinal = function() {
x = domain[i];
if (!(x in index)) index[x] = ++j;
}
rerange();
return scale;
};

scale.range = function(x) {
if (!arguments.length) return range;
range = x;
rerange = d3_noop;
return scale;
};

scale.rangePoints = function(x, padding) {
if (arguments.length < 2) padding = 0;
var start = x[0],
stop = x[1],
step = (stop - start) / (domain.length - 1 + padding);
range = domain.length == 1
? [(start + stop) / 2]
: d3.range(start + step * padding / 2, stop + step / 2, step);
rangeBand = 0;
(rerange = function() {
var start = x[0],
stop = x[1],
step = (stop - start) / (domain.length - 1 + padding);
range = domain.length == 1
? [(start + stop) / 2]
: d3.range(start + step * padding / 2, stop + step / 2, step);
rangeBand = 0;
})();
return scale;
};

scale.rangeBands = function(x, padding) {
if (arguments.length < 2) padding = 0;
var start = x[0],
stop = x[1],
step = (stop - start) / (domain.length + padding);
range = d3.range(start + step * padding, stop, step);
rangeBand = step * (1 - padding);
(rerange = function() {
var start = x[0],
stop = x[1],
step = (stop - start) / (domain.length + padding);
range = d3.range(start + step * padding, stop, step);
rangeBand = step * (1 - padding);
})();
return scale;
};

scale.rangeRoundBands = function(x, padding) {
if (arguments.length < 2) padding = 0;
var start = x[0],
stop = x[1],
diff = stop - start,
step = Math.floor(diff / (domain.length + padding)),
err = diff - (domain.length - padding) * step;
range = d3.range(start + Math.round(err / 2), stop, step);
rangeBand = Math.round(step * (1 - padding));
(rerange = function() {
var start = x[0],
stop = x[1],
diff = stop - start,
step = Math.floor(diff / (domain.length + padding)),
err = diff - (domain.length - padding) * step;
range = d3.range(start + Math.round(err / 2), stop, step);
rangeBand = Math.round(step * (1 - padding));
})();
return scale;
};

Expand Down
4 changes: 2 additions & 2 deletions d3.min.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/core/noop.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
function d3_noop() {}
49 changes: 29 additions & 20 deletions src/scale/ordinal.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ d3.scale.ordinal = function() {
var domain = [],
index = {},
range = [],
rangeBand = 0;
rangeBand = 0,
rerange = d3_noop;

function scale(x) {
var i = x in index ? index[x] : (index[x] = domain.push(x) - 1);
Expand All @@ -17,46 +18,54 @@ d3.scale.ordinal = function() {
x = domain[i];
if (!(x in index)) index[x] = ++j;
}
rerange();
return scale;
};

scale.range = function(x) {
if (!arguments.length) return range;
range = x;
rerange = d3_noop;
return scale;
};

scale.rangePoints = function(x, padding) {
if (arguments.length < 2) padding = 0;
var start = x[0],
stop = x[1],
step = (stop - start) / (domain.length - 1 + padding);
range = domain.length == 1
? [(start + stop) / 2]
: d3.range(start + step * padding / 2, stop + step / 2, step);
rangeBand = 0;
(rerange = function() {
var start = x[0],
stop = x[1],
step = (stop - start) / (domain.length - 1 + padding);
range = domain.length == 1
? [(start + stop) / 2]
: d3.range(start + step * padding / 2, stop + step / 2, step);
rangeBand = 0;
})();
return scale;
};

scale.rangeBands = function(x, padding) {
if (arguments.length < 2) padding = 0;
var start = x[0],
stop = x[1],
step = (stop - start) / (domain.length + padding);
range = d3.range(start + step * padding, stop, step);
rangeBand = step * (1 - padding);
(rerange = function() {
var start = x[0],
stop = x[1],
step = (stop - start) / (domain.length + padding);
range = d3.range(start + step * padding, stop, step);
rangeBand = step * (1 - padding);
})();
return scale;
};

scale.rangeRoundBands = function(x, padding) {
if (arguments.length < 2) padding = 0;
var start = x[0],
stop = x[1],
diff = stop - start,
step = Math.floor(diff / (domain.length + padding)),
err = diff - (domain.length - padding) * step;
range = d3.range(start + Math.round(err / 2), stop, step);
rangeBand = Math.round(step * (1 - padding));
(rerange = function() {
var start = x[0],
stop = x[1],
diff = stop - start,
step = Math.floor(diff / (domain.length + padding)),
err = diff - (domain.length - padding) * step;
range = d3.range(start + Math.round(err / 2), stop, step);
rangeBand = Math.round(step * (1 - padding));
})();
return scale;
};

Expand Down
79 changes: 79 additions & 0 deletions test/scale/test-ordinal.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
require("./../../lib/env-js/envjs/node");
require("./../../d3");

var x = d3.scale.ordinal().range(["a", "b", "c"]);
console.log("range([a, b, c]):");
console.log(" 0 -> " + x(0));
console.log(" 1 -> " + x(1));
console.log(" 2 -> " + x(2));
console.log(" 3 -> " + x(3));
console.log(" 4 -> " + x(4));
console.log(" 5 -> " + x(5));
console.log(" 6 -> " + x(6));
console.log(" 0 -> " + x(0));
console.log(" 1 -> " + x(1));
console.log(" 2 -> " + x(2));
console.log(" 3 -> " + x(3));
console.log("");

x.domain([]);
console.log("domain([]).range([a, b, c]):");
console.log(" 1 -> " + x(1));
console.log(" 2 -> " + x(2));
console.log(" 3 -> " + x(3));
console.log(" 0 -> " + x(0));
console.log(" 1 -> " + x(1));
console.log(" 2 -> " + x(2));
console.log("");

var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangePoints([0, 120]);
console.log("domain([a, b, c]).rangePoints([0, 120]):");
console.log(" a -> " + x("a"));
console.log(" b -> " + x("b"));
console.log(" c -> " + x("c"));
console.log(" d -> " + x("d"));
console.log("");

var x = d3.scale.ordinal().rangePoints([0, 120]).domain(["a", "b", "c"]);
console.log("rangePoints([0, 120]).domain([a, b, c]):");
console.log(" a -> " + x("a"));
console.log(" b -> " + x("b"));
console.log(" c -> " + x("c"));
console.log(" d -> " + x("d"));
console.log("");

var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangeBands([0, 120]);
console.log("domain([a, b, c]).rangeBands([0, 120]):");
console.log(" rangeBand: " + x.rangeBand());
console.log(" a -> " + x("a"));
console.log(" b -> " + x("b"));
console.log(" c -> " + x("c"));
console.log(" d -> " + x("d"));
console.log("");

var x = d3.scale.ordinal().rangeBands([0, 120]).domain(["a", "b", "c"]);
console.log("rangeBands([0, 120]).domain([a, b, c]):");
console.log(" rangeBand: " + x.rangeBand());
console.log(" a -> " + x("a"));
console.log(" b -> " + x("b"));
console.log(" c -> " + x("c"));
console.log(" d -> " + x("d"));
console.log("");

var x = d3.scale.ordinal().domain(["a", "b", "c"]).rangeRoundBands([0, 119]);
console.log("domain([a, b, c]).rangeRoundBands([0, 119]):");
console.log(" rangeBand: " + x.rangeBand());
console.log(" a -> " + x("a"));
console.log(" b -> " + x("b"));
console.log(" c -> " + x("c"));
console.log(" d -> " + x("d"));
console.log("");

var x = d3.scale.ordinal().rangeRoundBands([0, 119]).domain(["a", "b", "c"]);
console.log("rangeRoundBands([0, 119]).domain([a, b, c]):");
console.log(" rangeBand: " + x.rangeBand());
console.log(" a -> " + x("a"));
console.log(" b -> " + x("b"));
console.log(" c -> " + x("c"));
console.log(" d -> " + x("d"));
console.log("");
61 changes: 61 additions & 0 deletions test/scale/test-ordinal.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
range([a, b, c]):
0 -> a
1 -> b
2 -> c
3 -> a
4 -> b
5 -> c
6 -> a
0 -> a
1 -> b
2 -> c
3 -> a

domain([]).range([a, b, c]):
1 -> a
2 -> b
3 -> c
0 -> a
1 -> a
2 -> b

domain([a, b, c]).rangePoints([0, 120]):
a -> 0
b -> 60
c -> 120
d -> 0

rangePoints([0, 120]).domain([a, b, c]):
a -> 0
b -> 60
c -> 120
d -> 0

domain([a, b, c]).rangeBands([0, 120]):
rangeBand: 40
a -> 0
b -> 40
c -> 80
d -> 0

rangeBands([0, 120]).domain([a, b, c]):
rangeBand: 40
a -> 0
b -> 40
c -> 80
d -> 0

domain([a, b, c]).rangeRoundBands([0, 119]):
rangeBand: 39
a -> 1
b -> 40
c -> 79
d -> 118

rangeRoundBands([0, 119]).domain([a, b, c]):
rangeBand: 39
a -> 1
b -> 40
c -> 79
d -> 118

0 comments on commit 7590713

Please sign in to comment.