@@ -82,6 +82,7 @@ function handleDimensionsDefaults(traceIn, traceOut) {
82
82
// to fill in axis title defaults
83
83
coerce ( 'label' ) ;
84
84
85
+ // wait until plot step to filter out visible false dimensions
85
86
var visible = coerce ( 'visible' ) ;
86
87
if ( ! visible ) continue ;
87
88
@@ -108,67 +109,79 @@ function handleDimensionsDefaults(traceIn, traceOut) {
108
109
function handleAxisDefaults ( traceIn , traceOut , layout , coerce ) {
109
110
var dimensions = traceOut . dimensions ;
110
111
var dimLength = dimensions . length ;
111
- var i , j ;
112
-
113
112
var showUpper = traceOut . showupperhalf ;
114
113
var showLower = traceOut . showlowerhalf ;
115
- var showDiagonal = traceOut . diagonal . visible ;
116
-
117
- var axLength = ! showDiagonal && ( ! showUpper || ! showLower ) ?
118
- dimLength - 1 :
119
- dimLength ;
114
+ var showDiag = traceOut . diagonal . visible ;
115
+ var i , j ;
120
116
121
- var xaxesDflt = new Array ( axLength ) ;
122
- var yaxesDflt = new Array ( axLength ) ;
117
+ // N.B. one less x axis AND one less y axis when hiding one half and the diagonal
118
+ var axDfltLength = ! showDiag && ( ! showUpper || ! showLower ) ? dimLength - 1 : dimLength ;
123
119
124
- for ( i = 0 ; i < axLength ; i ++ ) {
125
- xaxesDflt [ i ] = 'x' + ( i ? i + 1 : '' ) ;
126
- yaxesDflt [ i ] = 'y' + ( i ? i + 1 : '' ) ;
127
- }
120
+ var xaxes = coerce ( 'xaxes' , fillAxisIdArray ( 'x' , axDfltLength ) ) ;
121
+ var yaxes = coerce ( 'yaxes' , fillAxisIdArray ( 'y' , axDfltLength ) ) ;
128
122
129
- var xaxes = coerce ( 'xaxes' , xaxesDflt ) ;
130
- var yaxes = coerce ( 'yaxes' , yaxesDflt ) ;
131
-
132
- // splom defaults set three types of 'length' values on the
133
- // full data items:
134
- //
135
- // - _commonLength: is the common length of each dimensions[i].values
136
- // - dimensions[i]._length: is a copy of _commonLength to each dimensions item
137
- // (this one is used during ax.makeCalcdata)
138
- // - _activeLength: is the number of dimensions that can generate axes for a given trace
139
- //
140
- // when looping from 0..activeLength dimensions and (x|y)axes indices should match.
141
- // note that `visible: false` dimensions contribute to activeLength and must
142
- // be skipped before drawing calls.
143
- var activeLength = traceOut . _activeLength = Math . min ( dimLength , xaxes . length , yaxes . length ) ;
144
-
145
- for ( i = 0 ; i < activeLength ; i ++ ) {
146
- var dim = dimensions [ i ] ;
147
- var xa = xaxes [ i ] ;
148
- var ya = yaxes [ i ] ;
123
+ // allow users to under-specify number of axes
124
+ var axLength = Math . min ( axDfltLength , xaxes . length , yaxes . length ) ;
149
125
150
- if ( ! ( xa in layout . _splomAxes . x ) ) {
151
- layout . _splomAxes . x [ xa ] = dim . label || '' ;
152
- }
153
- if ( ! ( ya in layout . _splomAxes . y ) ) {
154
- layout . _splomAxes . y [ ya ] = dim . label || '' ;
155
- }
156
- }
157
-
158
- for ( i = 0 ; i < activeLength ; i ++ ) {
159
- for ( j = 0 ; j < activeLength ; j ++ ) {
126
+ // fill in splom subplot keys
127
+ for ( i = 0 ; i < axLength ; i ++ ) {
128
+ for ( j = 0 ; j < axLength ; j ++ ) {
160
129
var id = [ xaxes [ i ] + yaxes [ j ] ] ;
161
130
162
131
if ( i > j && showUpper ) {
163
132
layout . _splomSubplots [ id ] = 1 ;
164
133
} else if ( i < j && showLower ) {
165
134
layout . _splomSubplots [ id ] = 1 ;
166
- } else if ( i === j && showDiagonal ) {
167
- layout . _splomSubplots [ id ] = 1 ;
135
+ } else {
136
+ // need to include diagonal subplots when
137
+ // hiding one half and the diagonal
138
+ if ( showDiag || ! showLower || ! showUpper ) {
139
+ layout . _splomSubplots [ id ] = 1 ;
140
+ }
168
141
}
169
142
}
170
143
}
171
144
172
- console . log ( xaxes , yaxes ) ;
173
- console . log ( Object . keys ( layout . _splomSubplots ) )
145
+ // build list of [x,y] axis corresponding to each dimensions[i],
146
+ // very useful for passing options to regl-scattermatrix
147
+ var diag = traceOut . _diag = new Array ( dimLength ) ;
148
+
149
+ // cases where showDiag and showLower or showUpper are false
150
+ // no special treatment as the xaxes and yaxes items no longer match
151
+ // the dimensions items 1-to-1
152
+ var xShift = ! showDiag && ! showLower ? - 1 : 0 ;
153
+ var yShift = ! showDiag && ! showUpper ? - 1 : 0 ;
154
+
155
+ for ( i = 0 ; i < dimLength ; i ++ ) {
156
+ var dim = dimensions [ i ] ;
157
+ var xa = xaxes [ i + xShift ] ;
158
+ var ya = yaxes [ i + yShift ] ;
159
+
160
+ fillAxisStash ( layout , xa , dim ) ;
161
+ fillAxisStash ( layout , ya , dim ) ;
162
+
163
+ // note that some the entries here may be undefined
164
+ diag [ i ] = [ xa , ya ] ;
165
+ }
166
+ }
167
+
168
+ function fillAxisIdArray ( axLetter , len ) {
169
+ var out = new Array ( len ) ;
170
+
171
+ for ( var i = 0 ; i < len ; i ++ ) {
172
+ out [ i ] = axLetter + ( i ? i + 1 : '' ) ;
173
+ }
174
+
175
+ return out ;
176
+ }
177
+
178
+ function fillAxisStash ( layout , axId , dim ) {
179
+ if ( ! axId ) return ;
180
+
181
+ var axLetter = axId . charAt ( 0 ) ;
182
+ var stash = layout . _splomAxes [ axLetter ] ;
183
+
184
+ if ( ! ( axId in stash ) ) {
185
+ stash [ axId ] = ( dim || { } ) . label || '' ;
186
+ }
174
187
}
0 commit comments