Skip to content

Commit cb97b4a

Browse files
committed
Fix a bug with descending rangeBands.
1 parent 522e269 commit cb97b4a

4 files changed

Lines changed: 59 additions & 18 deletions

File tree

d3.v2.js

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2866,21 +2866,26 @@ function d3_scale_ordinal(domain, ranger) {
28662866

28672867
scale.rangeBands = function(x, padding) {
28682868
if (arguments.length < 2) padding = 0;
2869-
var start = x[0],
2870-
stop = x[1],
2869+
var reverse = x[1] < x[0],
2870+
start = x[reverse - 0],
2871+
stop = x[1 - reverse],
28712872
step = (stop - start) / (domain.length + padding);
28722873
range = steps(start + step * padding, step);
2874+
if (reverse) range.reverse();
28732875
rangeBand = step * (1 - padding);
28742876
ranger = {t: "rangeBands", x: x, p: padding};
28752877
return scale;
28762878
};
28772879

28782880
scale.rangeRoundBands = function(x, padding) {
28792881
if (arguments.length < 2) padding = 0;
2880-
var start = x[0],
2881-
stop = x[1],
2882-
step = Math.floor((stop - start) / (domain.length + padding));
2883-
range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);
2882+
var reverse = x[1] < x[0],
2883+
start = x[reverse - 0],
2884+
stop = x[1 - reverse],
2885+
step = Math.floor((stop - start) / (domain.length + padding)),
2886+
error = stop - start - (domain.length - padding) * step;
2887+
range = steps(start + Math.round(error / 2), step);
2888+
if (reverse) range.reverse();
28842889
rangeBand = Math.round(step * (1 - padding));
28852890
ranger = {t: "rangeRoundBands", x: x, p: padding};
28862891
return scale;
@@ -2891,7 +2896,7 @@ function d3_scale_ordinal(domain, ranger) {
28912896
};
28922897

28932898
scale.rangeExtent = function() {
2894-
return ranger.t === "range" ? d3_scaleExtent(ranger.x) : ranger.x;
2899+
return d3_scaleExtent(ranger.x);
28952900
};
28962901

28972902
scale.copy = function() {

d3.v2.min.js

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

src/scale/ordinal.js

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,26 @@ function d3_scale_ordinal(domain, ranger) {
4545

4646
scale.rangeBands = function(x, padding) {
4747
if (arguments.length < 2) padding = 0;
48-
var start = x[0],
49-
stop = x[1],
48+
var reverse = x[1] < x[0],
49+
start = x[reverse - 0],
50+
stop = x[1 - reverse],
5051
step = (stop - start) / (domain.length + padding);
5152
range = steps(start + step * padding, step);
53+
if (reverse) range.reverse();
5254
rangeBand = step * (1 - padding);
5355
ranger = {t: "rangeBands", x: x, p: padding};
5456
return scale;
5557
};
5658

5759
scale.rangeRoundBands = function(x, padding) {
5860
if (arguments.length < 2) padding = 0;
59-
var start = x[0],
60-
stop = x[1],
61-
step = Math.floor((stop - start) / (domain.length + padding));
62-
range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);
61+
var reverse = x[1] < x[0],
62+
start = x[reverse - 0],
63+
stop = x[1 - reverse],
64+
step = Math.floor((stop - start) / (domain.length + padding)),
65+
error = stop - start - (domain.length - padding) * step;
66+
range = steps(start + Math.round(error / 2), step);
67+
if (reverse) range.reverse();
6368
rangeBand = Math.round(step * (1 - padding));
6469
ranger = {t: "rangeRoundBands", x: x, p: padding};
6570
return scale;
@@ -70,7 +75,7 @@ function d3_scale_ordinal(domain, ranger) {
7075
};
7176

7277
scale.rangeExtent = function() {
73-
return ranger.t === "range" ? d3_scaleExtent(ranger.x) : ranger.x;
78+
return d3_scaleExtent(ranger.x);
7479
};
7580

7681
scale.copy = function() {

test/scale/ordinal-test.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,17 @@ suite.addBatch({
119119
var x = ordinal().domain(["a", "b", "c"]).rangePoints([0, 120], 2);
120120
assert.deepEqual(x.range(), [30, 60, 90]);
121121
assert.equal(x.rangeBand(), 0);
122+
},
123+
"can be set to a descending range": function(ordinal) {
124+
var x = ordinal().domain(["a", "b", "c"]).rangePoints([120, 0]);
125+
assert.deepEqual(x.range(), [120, 60,0]);
126+
assert.equal(x.rangeBand(), 0);
127+
var x = ordinal().domain(["a", "b", "c"]).rangePoints([120, 0], 1);
128+
assert.deepEqual(x.range(), [100, 60, 20]);
129+
assert.equal(x.rangeBand(), 0);
130+
var x = ordinal().domain(["a", "b", "c"]).rangePoints([120, 0], 2);
131+
assert.deepEqual(x.range(), [90, 60, 30]);
132+
assert.equal(x.rangeBand(), 0);
122133
}
123134
},
124135

@@ -138,6 +149,14 @@ suite.addBatch({
138149
x.domain(["a", "b", "c", "d"]);
139150
assert.deepEqual(x.range(), [0, 25, 50, 75]);
140151
assert.equal(x.rangeBand(), 25);
152+
},
153+
"can be set to a descending range": function(ordinal) {
154+
var x = ordinal().domain(["a", "b", "c"]).rangeBands([120, 0]);
155+
assert.deepEqual(x.range(), [80, 40, 0]);
156+
assert.equal(x.rangeBand(), 40);
157+
var x = ordinal().domain(["a", "b", "c"]).rangeBands([120, 0], .2);
158+
assert.deepEqual(x.range(), [82.5, 45, 7.5]);
159+
assert.equal(x.rangeBand(), 30);
141160
}
142161
},
143162

@@ -149,6 +168,14 @@ suite.addBatch({
149168
var x = ordinal().domain(["a", "b", "c"]).rangeRoundBands([0, 100], .2);
150169
assert.deepEqual(x.range(), [7, 38, 69]);
151170
assert.equal(x.rangeBand(), 25);
171+
},
172+
"can be set to a descending range": function(ordinal) {
173+
var x = ordinal().domain(["a", "b", "c"]).rangeRoundBands([100, 0]);
174+
assert.deepEqual(x.range(), [67, 34, 1]);
175+
assert.equal(x.rangeBand(), 33);
176+
var x = ordinal().domain(["a", "b", "c"]).rangeRoundBands([100, 0], .2);
177+
assert.deepEqual(x.range(), [69, 38, 7]);
178+
assert.equal(x.rangeBand(), 25);
152179
}
153180
},
154181

@@ -162,6 +189,10 @@ suite.addBatch({
162189
assert.deepEqual(x.rangeExtent(), [0, 100]);
163190
var x = ordinal().domain(["a", "b", "c"]).range([0, 20, 100]);
164191
assert.deepEqual(x.rangeExtent(), [0, 100]);
192+
},
193+
"can handle descending ranges": function(ordinal) {
194+
var x = ordinal().domain(["a", "b", "c"]).rangeBands([100, 0]);
195+
assert.deepEqual(x.rangeExtent(), [0, 100]);
165196
}
166197
},
167198

0 commit comments

Comments
 (0)