@@ -51,10 +51,11 @@ function ScaleD(key, scale, transform, channels, {
51
51
52
52
// Normalize the interpolator for symmetric difference around the pivot.
53
53
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 ) ;
58
59
}
59
60
60
61
scale . domain ( [ min , pivot , max ] ) . unknown ( unknown ) . interpolator ( interpolate ) ;
@@ -64,37 +65,66 @@ function ScaleD(key, scale, transform, channels, {
64
65
}
65
66
66
67
export function ScaleDiverging ( key , channels , options ) {
67
- return ScaleD ( key , scaleDiverging ( ) , x => x , channels , options ) ;
68
+ return ScaleD ( key , scaleDiverging ( ) , transformIdentity , channels , options ) ;
68
69
}
69
70
70
71
export function ScaleDivergingSqrt ( key , channels , options ) {
71
72
return ScaleDivergingPow ( key , channels , { ...options , exponent : 0.5 } ) ;
72
73
}
73
74
74
75
export 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" } ) ;
76
77
}
77
78
78
79
export 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 } ) ;
80
81
}
81
82
82
83
export 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 ) ;
84
85
}
85
86
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
+ } ;
89
95
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
+ } ;
93
109
94
110
function 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
+ } ;
96
119
}
97
120
98
121
function 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
+ } ;
100
130
}
0 commit comments