diff --git a/src/scales/ordinal.js b/src/scales/ordinal.js index 2e7dd0c0de..caf18a4e13 100644 --- a/src/scales/ordinal.js +++ b/src/scales/ordinal.js @@ -17,7 +17,7 @@ function createScaleO(key, scale, channels, {type, interval, domain, range, reve if (domain === undefined) domain = inferDomain(channels, interval, key); if (type === "categorical" || type === ordinalImplicit) type = "ordinal"; // shorthand for color schemes if (reverse) domain = reverseof(domain); - scale.domain(domain); + domain = scale.domain(domain).domain(); // deduplicate if (range !== undefined) { // If the range is specified as a function, pass it the domain. if (typeof range === "function") range = range(domain); diff --git a/test/scales/scales-test.js b/test/scales/scales-test.js index 2303cfc2ef..146e0e1a92 100644 --- a/test/scales/scales-test.js +++ b/test/scales/scales-test.js @@ -2102,6 +2102,36 @@ it("plot(…).scale(name).apply and invert return the expected functions", () => ]); }); +it("plot(…).scale(name) returns a deduplicated ordinal domain", () => { + const letters = "abbbcaabbcc"; + const plot = Plot.dotX(letters).plot({x: {domain: letters}}); + scaleEqual(plot.scale("x"), { + align: 0.5, + bandwidth: 0, + domain: ["a", "b", "c"], + padding: 0.5, + range: [20, 620], + round: true, + step: 200, + type: "point" + }); +}); + +it("plot(…).scale(name) returns a deduplicated ordinal/temporal domain", () => { + const dates = ["2001", "2002", "2004", "2004"].map(d3.isoParse); + const plot = Plot.dotX(dates).plot({x: {type: "point", domain: dates}}); + scaleEqual(plot.scale("x"), { + align: 0.5, + bandwidth: 0, + domain: dates.slice(0, 3), + padding: 0.5, + range: [20, 620], + round: true, + step: 200, + type: "point" + }); +}); + // Given a plot specification (or, as shorthand, an array of marks or a single // mark), asserts that the given named scales, when materialized from the first // plot and used to produce a second plot, produce the same output and the same