@@ -73,97 +73,95 @@ function handleAxisDefaults(traceIn, traceOut, layout, coerce) {
73
73
var showDiag = traceOut . diagonal . visible ;
74
74
var i , j ;
75
75
76
- // N.B. one less x axis AND one less y axis when hiding one half and the diagonal
77
- var axDfltLength = ! showDiag && ( ! showUpper || ! showLower ) ? dimLength - 1 : dimLength ;
76
+ var xAxesDflt = new Array ( dimLength ) ;
77
+ var yAxesDflt = new Array ( dimLength ) ;
78
78
79
- var xaxes = coerce ( 'xaxes' , fillAxisIdArray ( 'x' , axDfltLength ) ) ;
80
- var yaxes = coerce ( 'yaxes' , fillAxisIdArray ( 'y' , axDfltLength ) ) ;
79
+ for ( i = 0 ; i < dimLength ; i ++ ) {
80
+ var suffix = i ? i + 1 : '' ;
81
+ xAxesDflt [ i ] = 'x' + suffix ;
82
+ yAxesDflt [ i ] = 'y' + suffix ;
83
+ }
81
84
82
- // to avoid costly indexOf
83
- traceOut . _xaxes = arrayToHashObject ( xaxes ) ;
84
- traceOut . _yaxes = arrayToHashObject ( yaxes ) ;
85
+ var xaxes = coerce ( 'xaxes' , xAxesDflt ) ;
86
+ var yaxes = coerce ( 'yaxes' , yAxesDflt ) ;
85
87
86
- // allow users to under-specify number of axes
87
- var axLength = Math . min ( axDfltLength , xaxes . length , yaxes . length ) ;
88
+ // build list of [x,y] axis corresponding to each dimensions[i],
89
+ // very useful for passing options to regl-splom
90
+ var diag = traceOut . _diag = new Array ( dimLength ) ;
88
91
89
- // fill in splom subplot keys
90
- for ( i = 0 ; i < axLength ; i ++ ) {
91
- for ( j = 0 ; j < axLength ; j ++ ) {
92
- var id = xaxes [ i ] + yaxes [ j ] ;
92
+ // lookup for 'drawn' x|y axes, to avoid costly indexOf downstream
93
+ traceOut . _xaxes = { } ;
94
+ traceOut . _yaxes = { } ;
93
95
94
- if ( i > j && showUpper ) {
95
- layout . _splomSubplots [ id ] = 1 ;
96
- } else if ( i < j && showLower ) {
97
- layout . _splomSubplots [ id ] = 1 ;
98
- } else if ( i === j && ( showDiag || ! showLower || ! showUpper ) ) {
99
- // need to include diagonal subplots when
100
- // hiding one half and the diagonal
101
- layout . _splomSubplots [ id ] = 1 ;
96
+ // list of 'drawn' x|y axes, use to generate list of subplots
97
+ var xList = [ ] ;
98
+ var yList = [ ] ;
99
+
100
+ function fillAxisStashes ( axId , dim , list ) {
101
+ if ( ! axId ) return ;
102
+
103
+ var axLetter = axId . charAt ( 0 ) ;
104
+ var stash = layout . _splomAxes [ axLetter ] ;
105
+
106
+ traceOut [ '_' + axLetter + 'axes' ] [ axId ] = 1 ;
107
+ list . push ( axId ) ;
108
+
109
+ if ( ! ( axId in stash ) ) {
110
+ var s = stash [ axId ] = { } ;
111
+ if ( dim ) {
112
+ s . label = dim . label || '' ;
113
+ if ( dim . visible && dim . axis ) {
114
+ s . type = dim . axis . type ;
115
+ }
102
116
}
103
117
}
104
118
}
105
119
106
- // build list of [x,y] axis corresponding to each dimensions[i],
107
- // very useful for passing options to regl-splom
108
- var diag = traceOut . _diag = new Array ( dimLength ) ;
109
-
110
120
// cases where showDiag and showLower or showUpper are false
111
- // no special treatment as the xaxes and yaxes items no longer match
112
- // the dimensions items 1-to-1
113
- var xShift = ! showDiag && ! showLower ? - 1 : 0 ;
114
- var yShift = ! showDiag && ! showUpper ? - 1 : 0 ;
121
+ // no special treatment as the 'drawn' x-axes and y-axes no longer match
122
+ // the dimensions items and xaxes|yaxes 1-to-1
123
+ var mustShiftX = ! showDiag && ! showLower ;
124
+ var mustShiftY = ! showDiag && ! showUpper ;
115
125
116
126
for ( i = 0 ; i < dimLength ; i ++ ) {
117
127
var dim = dimensions [ i ] ;
118
- var xaId = xaxes [ i + xShift ] ;
119
- var yaId = yaxes [ i + yShift ] ;
120
-
121
- fillAxisStash ( layout , xaId , dim ) ;
122
- fillAxisStash ( layout , yaId , dim ) ;
123
-
124
- // note that some the entries here may be undefined
125
- diag [ i ] = [ xaId , yaId ] ;
126
- }
128
+ var i0 = i === 0 ;
129
+ var iN = i === dimLength - 1 ;
127
130
128
- // when lower half is omitted, override grid default
129
- // to make sure axes remain on the left/bottom of the plot area
130
- if ( ! showLower ) {
131
- layout . _splomGridDflt . xside = 'bottom' ;
132
- layout . _splomGridDflt . yside = 'left' ;
133
- }
134
- }
131
+ var xaId = ( i0 && mustShiftX ) || ( iN && mustShiftY ) ?
132
+ undefined :
133
+ xaxes [ i ] ;
135
134
136
- function fillAxisIdArray ( axLetter , len ) {
137
- var out = new Array ( len ) ;
135
+ var yaId = ( i0 && mustShiftY ) || ( iN && mustShiftX ) ?
136
+ undefined :
137
+ yaxes [ i ] ;
138
138
139
- for ( var i = 0 ; i < len ; i ++ ) {
140
- out [ i ] = axLetter + ( i ? i + 1 : '' ) ;
139
+ fillAxisStashes ( xaId , dim , xList ) ;
140
+ fillAxisStashes ( yaId , dim , yList ) ;
141
+ diag [ i ] = [ xaId , yaId ] ;
141
142
}
142
143
143
- return out ;
144
- }
145
-
146
- function fillAxisStash ( layout , axId , dim ) {
147
- if ( ! axId ) return ;
148
-
149
- var axLetter = axId . charAt ( 0 ) ;
150
- var stash = layout . _splomAxes [ axLetter ] ;
144
+ // fill in splom subplot keys
145
+ for ( i = 0 ; i < xList . length ; i ++ ) {
146
+ for ( j = 0 ; j < yList . length ; j ++ ) {
147
+ var id = xList [ i ] + yList [ j ] ;
151
148
152
- if ( ! ( axId in stash ) ) {
153
- var s = stash [ axId ] = { } ;
154
- if ( dim ) {
155
- s . label = dim . label || '' ;
156
- if ( dim . visible && dim . axis ) {
157
- s . type = dim . axis . type ;
149
+ if ( i > j && showUpper ) {
150
+ layout . _splomSubplots [ id ] = 1 ;
151
+ } else if ( i < j && showLower ) {
152
+ layout . _splomSubplots [ id ] = 1 ;
153
+ } else if ( i === j && ( showDiag || ! showLower || ! showUpper ) ) {
154
+ // need to include diagonal subplots when
155
+ // hiding one half and the diagonal
156
+ layout . _splomSubplots [ id ] = 1 ;
158
157
}
159
158
}
160
159
}
161
- }
162
160
163
- function arrayToHashObject ( arr ) {
164
- var obj = { } ;
165
- for ( var i = 0 ; i < arr . length ; i ++ ) {
166
- obj [ arr [ i ] ] = 1 ;
161
+ // when lower half is omitted, override grid default
162
+ // to make sure axes remain on the left/bottom of the plot area
163
+ if ( ! showLower ) {
164
+ layout . _splomGridDflt . xside = 'bottom' ;
165
+ layout . _splomGridDflt . yside = 'left' ;
167
166
}
168
- return obj ;
169
167
}
0 commit comments