From de485636b46c73372042801c5ba9a1ad4a4d6b66 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 8 Apr 2021 13:40:29 -0700 Subject: [PATCH] autoround --- src/scales.js | 8 ++++++++ src/scales/ordinal.js | 20 ++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/scales.js b/src/scales.js index 1e805f0b51..a339508657 100644 --- a/src/scales.js +++ b/src/scales.js @@ -35,6 +35,7 @@ function autoScaleRangeX(scale, dimensions) { const {width, marginLeft = 0, marginRight = 0} = dimensions; scale.scale.range([marginLeft + inset, width - marginRight - inset]); } + autoScaleRound(scale); } function autoScaleRangeY(scale, dimensions) { @@ -45,6 +46,13 @@ function autoScaleRangeY(scale, dimensions) { if (scale.type === "ordinal") range.reverse(); scale.scale.range(range); } + autoScaleRound(scale); +} + +function autoScaleRound(scale) { + if (scale.round === undefined && scale.type === "ordinal" && scale.scale.step() >= 5) { + scale.scale.round(true); + } } function Scale(key, channels = [], options = {}) { diff --git a/src/scales/ordinal.js b/src/scales/ordinal.js index f1c9ed6fa2..59012a3de8 100644 --- a/src/scales/ordinal.js +++ b/src/scales/ordinal.js @@ -209,14 +209,12 @@ export function ScaleOrdinal(key, channels, { export function ScalePoint(key, channels, { align = 0.5, padding = 0.5, - round = true, ...options }) { - return ScaleO( + return maybeRound( scalePoint() .align(align) - .padding(padding) - .round(round), + .padding(padding), channels, options ); @@ -227,20 +225,26 @@ export function ScaleBand(key, channels, { padding = 0.1, paddingInner = padding, paddingOuter = key === "fx" || key === "fy" ? 0 : padding, - round = true, ...options }) { - return ScaleO( + return maybeRound( scaleBand() .align(align) .paddingInner(paddingInner) - .paddingOuter(paddingOuter) - .round(round), + .paddingOuter(paddingOuter), channels, options ); } +function maybeRound(scale, channels, options = {}) { + const {round} = options; + if (round !== undefined) scale.round(round); + scale = ScaleO(scale, channels, options); + scale.round = round; + return scale; +} + function inferDomain(channels) { const domain = new Set(); for (const {value} of channels) {