@@ -76,6 +76,7 @@ export function Scales(
7676 label = key === "fx" || key === "fy" ? facetLabel : globalLabel ,
7777 percent,
7878 transform,
79+ interval,
7980 inset,
8081 insetTop = inset !== undefined ? inset : key === "y" ? globalInsetTop : 0 , // not fy
8182 insetRight = inset !== undefined ? inset : key === "x" ? globalInsetRight : 0 , // not fx
@@ -87,6 +88,32 @@ export function Scales(
8788 scale . percent = ! ! percent ;
8889 scale . label = label === undefined ? inferScaleLabel ( channels , scale ) : label ;
8990 scale . transform = transform ;
91+
92+ // A flag indicating that a sample of the values on every channel are
93+ // integers; an axis may use that information to decide its tickFormat.
94+ if (
95+ ! transform &&
96+ ! scale . percent &&
97+ ( scale . type === "linear" || scale . type === "point" || scale . type === "band" )
98+ ) {
99+ if ( typeof interval === "number" ) {
100+ scale . integer = interval === Math . floor ( interval ) ;
101+ } else {
102+ channels: for ( const { value} of channels ) {
103+ let c = 0 ;
104+ for ( const x of value ) {
105+ if ( typeof x !== "number" || ( x && x > Math . floor ( x ) ) ) {
106+ scale . integer = false ;
107+ break channels;
108+ } else if ( isFinite ( x ) ) {
109+ scale . integer = true ;
110+ if ( ++ c > 40 ) break ;
111+ }
112+ }
113+ }
114+ }
115+ }
116+
90117 if ( key === "x" || key === "fx" ) {
91118 scale . insetLeft = + insetLeft ;
92119 scale . insetRight = + insetRight ;
@@ -567,11 +594,23 @@ export function exposeScales(scales) {
567594 } ;
568595}
569596
570- function censorScale ( { label, ...scale } ) {
597+ function censorScale ( { label, integer , ...scale } ) {
571598 return scale ;
572599}
573600
574- function instantiateScale ( { scale, type, domain, range, interpolate, interval, transform, percent, pivot, label} ) {
601+ function instantiateScale ( {
602+ scale,
603+ type,
604+ domain,
605+ range,
606+ interpolate,
607+ interval,
608+ transform,
609+ percent,
610+ pivot,
611+ label,
612+ integer
613+ } ) {
575614 if ( type === "identity" ) return { type, apply : ( d ) => d , invert : ( d ) => d } ;
576615 const unknown = scale . unknown ? scale . unknown ( ) : undefined ;
577616 return {
@@ -580,6 +619,7 @@ function instantiateScale({scale, type, domain, range, interpolate, interval, tr
580619 ...( range !== undefined && { range : slice ( range ) } ) , // defensive copy
581620 ...( transform !== undefined && { transform} ) ,
582621 ...( percent && { percent} ) , // only exposed if truthy
622+ ...( integer !== undefined && { integer} ) ,
583623 ...( unknown !== undefined && { unknown} ) ,
584624 ...( interval !== undefined && { interval} ) ,
585625
0 commit comments