Skip to content

Commit 15de9c2

Browse files
authored
allow quantile or threshold position scales (#573)
1 parent cb2642d commit 15de9c2

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

src/scales.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ function autoScaleRangeY(scale, dimensions) {
8484
const {insetTop, insetBottom} = scale;
8585
const {height, marginTop = 0, marginBottom = 0} = dimensions;
8686
scale.range = [height - marginBottom - insetBottom, marginTop + insetTop];
87-
if (isOrdinalScale(scale)) scale.range.reverse();
88-
else scale.range = piecewiseRange(scale);
87+
if (!isOrdinalScale(scale)) scale.range = piecewiseRange(scale);
88+
else scale.range.reverse();
8989
scale.scale.range(scale.range);
9090
}
9191
autoScaleRound(scale);
@@ -111,10 +111,10 @@ function roundError({scale}) {
111111
return (step - Math.floor(step)) * m;
112112
}
113113

114-
function piecewiseRange({scale, range}) {
115-
const length = scale.domain().length;
116-
if (!(length > 2)) return range;
117-
const [start, end] = range;
114+
function piecewiseRange(scale) {
115+
const length = scale.scale.domain().length + isThresholdScale(scale);
116+
if (!(length > 2)) return scale.range;
117+
const [start, end] = scale.range;
118118
return Array.from({length}, (_, i) => start + i / (length - 1) * (end - start));
119119
}
120120

@@ -217,6 +217,10 @@ export function isOrdinalScale({type}) {
217217
return type === "ordinal" || type === "point" || type === "band";
218218
}
219219

220+
function isThresholdScale({type}) {
221+
return type === "threshold";
222+
}
223+
220224
function isBandScale({type}) {
221225
return type === "point" || type === "band";
222226
}

src/scales/quantitative.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ export function ScaleQuantile(key, channels, {
132132
reverse
133133
}) {
134134
return ScaleThreshold(key, channels, {
135-
domain: scaleQuantile(domain, range).quantiles(),
135+
domain: scaleQuantile(domain, range === undefined ? {length: quantiles} : range).quantiles(),
136136
range,
137137
reverse
138138
});
@@ -152,7 +152,7 @@ export function ScaleThreshold(key, channels, {
152152
}) {
153153
if (!pairs(domain).every(([a, b]) => ascending(a, b) <= 0)) throw new Error("non-ascending domain");
154154
if (reverse) range = reverseof(range); // domain ascending, so reverse range
155-
return {type: "threshold", scale: scaleThreshold(domain, range).unknown(unknown), domain, range};
155+
return {type: "threshold", scale: scaleThreshold(domain, range === undefined ? [] : range).unknown(unknown), domain, range};
156156
}
157157

158158
export function ScaleIdentity() {

0 commit comments

Comments
 (0)