Skip to content

Commit 744aa96

Browse files
committed
Define behavior for mismatched domain & range.
1 parent 7a4a8ec commit 744aa96

5 files changed

Lines changed: 14 additions & 6 deletions

File tree

d3.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2430,7 +2430,7 @@ function d3_scale_linear(domain, range, interpolate, clamp) {
24302430
input;
24312431

24322432
function rescale() {
2433-
var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear,
2433+
var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear,
24342434
uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
24352435
output = linear(domain, range, uninterpolate, interpolate);
24362436
input = linear(range, domain, uninterpolate, d3.interpolate);
@@ -2542,7 +2542,7 @@ function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
25422542
var u = [],
25432543
i = [],
25442544
j = 0,
2545-
k = domain.length - 1;
2545+
k = Math.min(domain.length, range.length) - 1;
25462546

25472547
// Handle descending domains.
25482548
if (domain[k] < domain[0]) {

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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ function d3_scale_linear(domain, range, interpolate, clamp) {
77
input;
88

99
function rescale() {
10-
var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear,
10+
var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear,
1111
uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
1212
output = linear(domain, range, uninterpolate, interpolate);
1313
input = linear(range, domain, uninterpolate, d3.interpolate);

src/scale/polylinear.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
22
var u = [],
33
i = [],
44
j = 0,
5-
k = domain.length - 1;
5+
k = Math.min(domain.length, range.length) - 1;
66

77
// Handle descending domains.
88
if (domain[k] < domain[0]) {

test/scale/linear-test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ suite.addBatch({
4343
assert.equal(x(50), "#80c080");
4444
assert.equal(x(75), "#40a040");
4545
},
46+
"the smaller of the domain or range is observed": function(linear) {
47+
var x = linear().domain([-10, 0]).range(["red", "white", "green"]).clamp(true);
48+
assert.equal(x(-5), "#ff8080");
49+
assert.equal(x(50), "#ffffff");
50+
var x = linear().domain([-10, 0, 100]).range(["red", "white"]).clamp(true);
51+
assert.equal(x(-5), "#ff8080");
52+
assert.equal(x(50), "#ffffff");
53+
},
4654
"an empty domain maps to the range start": function(linear) {
4755
var x = linear().domain([0, 0]).range(["red", "green"]);
4856
assert.equal(x(0), "#ff0000");

0 commit comments

Comments
 (0)