@@ -76,6 +76,7 @@ export function Scales(
76
76
label = key === "fx" || key === "fy" ? facetLabel : globalLabel ,
77
77
percent,
78
78
transform,
79
+ interval,
79
80
inset,
80
81
insetTop = inset !== undefined ? inset : key === "y" ? globalInsetTop : 0 , // not fy
81
82
insetRight = inset !== undefined ? inset : key === "x" ? globalInsetRight : 0 , // not fx
@@ -87,6 +88,32 @@ export function Scales(
87
88
scale . percent = ! ! percent ;
88
89
scale . label = label === undefined ? inferScaleLabel ( channels , scale ) : label ;
89
90
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
+
90
117
if ( key === "x" || key === "fx" ) {
91
118
scale . insetLeft = + insetLeft ;
92
119
scale . insetRight = + insetRight ;
@@ -567,11 +594,23 @@ export function exposeScales(scales) {
567
594
} ;
568
595
}
569
596
570
- function censorScale ( { label, ...scale } ) {
597
+ function censorScale ( { label, integer , ...scale } ) {
571
598
return scale ;
572
599
}
573
600
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
+ } ) {
575
614
if ( type === "identity" ) return { type, apply : ( d ) => d , invert : ( d ) => d } ;
576
615
const unknown = scale . unknown ? scale . unknown ( ) : undefined ;
577
616
return {
@@ -580,6 +619,7 @@ function instantiateScale({scale, type, domain, range, interpolate, interval, tr
580
619
...( range !== undefined && { range : slice ( range ) } ) , // defensive copy
581
620
...( transform !== undefined && { transform} ) ,
582
621
...( percent && { percent} ) , // only exposed if truthy
622
+ ...( integer !== undefined && { integer} ) ,
583
623
...( unknown !== undefined && { unknown} ) ,
584
624
...( interval !== undefined && { interval} ) ,
585
625
0 commit comments