@@ -51,10 +51,11 @@ function ScaleD(key, scale, transform, channels, {
5151
5252 // Normalize the interpolator for symmetric difference around the pivot.
5353 if ( symmetric ) {
54- const mindelta = Math . abs ( transform ( min ) - transform ( pivot ) ) ;
55- const maxdelta = Math . abs ( transform ( max ) - transform ( pivot ) ) ;
56- if ( mindelta < maxdelta ) interpolate = truncateLower ( interpolate , mindelta / maxdelta ) ;
57- else if ( mindelta > maxdelta ) interpolate = truncateUpper ( interpolate , maxdelta / mindelta ) ;
54+ const mid = transform . apply ( pivot ) ;
55+ const mindelta = mid - transform . apply ( min ) ;
56+ const maxdelta = transform . apply ( max ) - mid ;
57+ if ( mindelta < maxdelta ) min = transform . invert ( mid - maxdelta ) ;
58+ else if ( mindelta > maxdelta ) max = transform . invert ( mid + mindelta ) ;
5859 }
5960
6061 scale . domain ( [ min , pivot , max ] ) . unknown ( unknown ) . interpolator ( interpolate ) ;
@@ -64,37 +65,66 @@ function ScaleD(key, scale, transform, channels, {
6465}
6566
6667export function ScaleDiverging ( key , channels , options ) {
67- return ScaleD ( key , scaleDiverging ( ) , x => x , channels , options ) ;
68+ return ScaleD ( key , scaleDiverging ( ) , transformIdentity , channels , options ) ;
6869}
6970
7071export function ScaleDivergingSqrt ( key , channels , options ) {
7172 return ScaleDivergingPow ( key , channels , { ...options , exponent : 0.5 } ) ;
7273}
7374
7475export function ScaleDivergingPow ( key , channels , { exponent = 1 , ...options } ) {
75- return ScaleD ( key , scaleDivergingPow ( ) . exponent ( exponent ) , transformPow ( exponent ) , channels , { ...options , type : "diverging-pow" } ) ;
76+ return ScaleD ( key , scaleDivergingPow ( ) . exponent ( exponent = + exponent ) , transformPow ( exponent ) , channels , { ...options , type : "diverging-pow" } ) ;
7677}
7778
7879export function ScaleDivergingLog ( key , channels , { base = 10 , pivot = 1 , domain = inferDomain ( channels , pivot < 0 ? negative : positive ) , ...options } ) {
79- return ScaleD ( key , scaleDivergingLog ( ) . base ( base ) , Math . log , channels , { domain, pivot, ...options } ) ;
80+ return ScaleD ( key , scaleDivergingLog ( ) . base ( base = + base ) , transformLog , channels , { domain, pivot, ...options } ) ;
8081}
8182
8283export function ScaleDivergingSymlog ( key , channels , { constant = 1 , ...options } ) {
83- return ScaleD ( key , scaleDivergingSymlog ( ) . constant ( constant ) , transformSymlog ( constant ) , channels , options ) ;
84+ return ScaleD ( key , scaleDivergingSymlog ( ) . constant ( constant = + constant ) , transformSymlog ( constant ) , channels , options ) ;
8485}
8586
86- function truncateLower ( interpolate , k ) {
87- return t => interpolate ( t < 0.5 ? t * k + ( 1 - k ) / 2 : t ) ;
88- }
87+ const transformIdentity = {
88+ apply ( x ) {
89+ return x ;
90+ } ,
91+ invert ( x ) {
92+ return x ;
93+ }
94+ } ;
8995
90- function truncateUpper ( interpolate , k ) {
91- return t => interpolate ( t > 0.5 ? t * k + ( 1 - k ) / 2 : t ) ;
92- }
96+ const transformLog = {
97+ apply : Math . log ,
98+ invert : Math . exp
99+ } ;
100+
101+ const transformSqrt = {
102+ apply ( x ) {
103+ return Math . sign ( x ) * Math . sqrt ( Math . abs ( x ) ) ;
104+ } ,
105+ invert ( x ) {
106+ return Math . sign ( x ) * ( x * x ) ;
107+ }
108+ } ;
93109
94110function transformPow ( exponent ) {
95- return exponent === 0.5 ? Math . sqrt : x => Math . sign ( x ) * Math . pow ( Math . abs ( x ) , exponent ) ;
111+ return exponent === 0.5 ? transformSqrt : {
112+ apply ( x ) {
113+ return Math . sign ( x ) * Math . pow ( Math . abs ( x ) , exponent ) ;
114+ } ,
115+ invert ( x ) {
116+ return Math . sign ( x ) * Math . pow ( Math . abs ( x ) , 1 / exponent ) ;
117+ }
118+ } ;
96119}
97120
98121function transformSymlog ( constant ) {
99- return x => Math . sign ( x ) * Math . log1p ( Math . abs ( x / constant ) ) ;
122+ return {
123+ apply ( x ) {
124+ return Math . sign ( x ) * Math . log1p ( Math . abs ( x / constant ) ) ;
125+ } ,
126+ invert ( x ) {
127+ return Math . sign ( x ) * Math . expm1 ( Math . abs ( x ) ) * constant ;
128+ }
129+ } ;
100130}
0 commit comments