From ef1969889efdcec9ee588a5d2f405b6d554a59ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Mon, 29 Jul 2024 01:21:55 +0200 Subject: [PATCH] fix autoHeight and outerRange for empty scale domains (#1864) closes #1856 --- src/dimensions.js | 5 ++--- src/plot.js | 1 + test/output/autoHeightEmpty.svg | 25 +++++++++++++++++++++++++ test/plots/autoheight.ts | 5 +++++ test/plots/index.ts | 1 + 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 test/output/autoHeightEmpty.svg create mode 100644 test/plots/autoheight.ts diff --git a/src/dimensions.js b/src/dimensions.js index cb7a7f13a1..ada0f64787 100644 --- a/src/dimensions.js +++ b/src/dimensions.js @@ -92,7 +92,7 @@ function autoHeight( {projection, aspectRatio}, {width, marginTopDefault, marginRightDefault, marginBottomDefault, marginLeftDefault} ) { - const nfy = fy ? fy.scale.domain().length : 1; + const nfy = fy ? fy.scale.domain().length || 1 : 1; // If a projection is specified, compute an aspect ratio based on the domain, // defaulting to the projection’s natural aspect ratio (if known). @@ -103,8 +103,7 @@ function autoHeight( const lar = Math.max(0.1, Math.min(10, far)); // clamp the aspect ratio to a “reasonable” value return Math.round((width - marginLeftDefault - marginRightDefault) * lar + marginTopDefault + marginBottomDefault); } - - const ny = y ? (isOrdinalScale(y) ? y.scale.domain().length : Math.max(7, 17 / nfy)) : 1; + const ny = y ? (isOrdinalScale(y) ? y.scale.domain().length || 1 : Math.max(7, 17 / nfy)) : 1; // If a desired aspect ratio is given, compute a default height to match. if (aspectRatio != null) { diff --git a/src/plot.js b/src/plot.js index a091d8d8a8..1e8daf22b8 100644 --- a/src/plot.js +++ b/src/plot.js @@ -732,6 +732,7 @@ function actualDimensions({fx, fy}, dimensions) { function outerRange(scale) { const domain = scale.domain(); + if (domain.length === 0) return [0, scale.bandwidth()]; let x1 = scale(domain[0]); let x2 = scale(domain[domain.length - 1]); if (x2 < x1) [x1, x2] = [x2, x1]; diff --git a/test/output/autoHeightEmpty.svg b/test/output/autoHeightEmpty.svg new file mode 100644 index 0000000000..6277e5e83a --- /dev/null +++ b/test/output/autoHeightEmpty.svg @@ -0,0 +1,25 @@ + + + + path + + + visitors + + + date + + \ No newline at end of file diff --git a/test/plots/autoheight.ts b/test/plots/autoheight.ts new file mode 100644 index 0000000000..4fb89e79ce --- /dev/null +++ b/test/plots/autoheight.ts @@ -0,0 +1,5 @@ +import * as Plot from "@observablehq/plot"; + +export async function autoHeightEmpty() { + return Plot.rectY([], {x: "date", y: "visitors", fy: "path"}).plot(); +} diff --git a/test/plots/index.ts b/test/plots/index.ts index f82888ee67..6b4742539e 100644 --- a/test/plots/index.ts +++ b/test/plots/index.ts @@ -27,6 +27,7 @@ export * from "./athletes-sport-sex.js"; export * from "./athletes-sport-weight.js"; export * from "./athletes-weight-cumulative.js"; export * from "./athletes-weight.js"; +export * from "./autoheight.js"; export * from "./autoplot.js"; export * from "./availability.js"; export * from "./axis-filter.js";