@@ -20,28 +20,36 @@ var axisIds = require('./axis_ids');
20
20
21
21
22
22
module . exports = function supplyLayoutDefaults ( layoutIn , layoutOut , fullData ) {
23
- // get the full list of axes already defined
24
23
var layoutKeys = Object . keys ( layoutIn ) ,
25
- xaList = [ ] ,
26
- yaList = [ ] ,
24
+ xaListCartesian = [ ] ,
25
+ yaListCartesian = [ ] ,
26
+ xaListGl2d = [ ] ,
27
+ yaListGl2d = [ ] ,
27
28
outerTicks = { } ,
28
29
noGrids = { } ,
29
30
i ;
30
31
31
- for ( i = 0 ; i < layoutKeys . length ; i ++ ) {
32
- var key = layoutKeys [ i ] ;
33
- if ( constants . xAxisMatch . test ( key ) ) xaList . push ( key ) ;
34
- else if ( constants . yAxisMatch . test ( key ) ) yaList . push ( key ) ;
35
- }
36
-
32
+ // look for axes in the data
37
33
for ( i = 0 ; i < fullData . length ; i ++ ) {
38
- var trace = fullData [ i ] ,
39
- xaName = axisIds . id2name ( trace . xaxis ) ,
34
+ var trace = fullData [ i ] ;
35
+ var listX , listY ;
36
+
37
+ if ( Plots . traceIs ( trace , 'cartesian' ) ) {
38
+ listX = xaListCartesian ;
39
+ listY = yaListCartesian ;
40
+ }
41
+ else if ( Plots . traceIs ( trace , 'gl2d' ) ) {
42
+ listX = xaListGl2d ;
43
+ listY = yaListGl2d ;
44
+ }
45
+ else continue ;
46
+
47
+ var xaName = axisIds . id2name ( trace . xaxis ) ,
40
48
yaName = axisIds . id2name ( trace . yaxis ) ;
41
49
42
50
// add axes implied by traces
43
- if ( xaName && xaList . indexOf ( xaName ) === - 1 ) xaList . push ( xaName ) ;
44
- if ( yaName && yaList . indexOf ( yaName ) === - 1 ) yaList . push ( yaName ) ;
51
+ if ( xaName && listX . indexOf ( xaName ) === - 1 ) listX . push ( xaName ) ;
52
+ if ( yaName && listY . indexOf ( yaName ) === - 1 ) listY . push ( yaName ) ;
45
53
46
54
// check for default formatting tweaks
47
55
if ( Plots . traceIs ( trace , '2dMap' ) ) {
@@ -55,22 +63,47 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
55
63
}
56
64
}
57
65
58
- function axSort ( a , b ) {
59
- var aNum = Number ( a . substr ( 5 ) || 1 ) ,
60
- bNum = Number ( b . substr ( 5 ) || 1 ) ;
61
- return aNum - bNum ;
66
+ // N.B. Ignore orphan axes (i.e. axes that have no data attached to them)
67
+ // if gl3d or geo is present on graph. This is retain backward compatible.
68
+ //
69
+ // TODO drop this in version 2.0
70
+ var ignoreOrphan = ( layoutOut . _hasGL3D || layoutOut . _hasGeo ) ;
71
+
72
+ if ( ! ignoreOrphan ) {
73
+ for ( i = 0 ; i < layoutKeys . length ; i ++ ) {
74
+ var key = layoutKeys [ i ] ;
75
+
76
+ // orphan layout axes are considered cartesian subplots
77
+
78
+ if ( xaListGl2d . indexOf ( key ) === - 1 &&
79
+ xaListCartesian . indexOf ( key ) === - 1 &&
80
+ constants . xAxisMatch . test ( key ) ) {
81
+ xaListCartesian . push ( key ) ;
82
+ }
83
+ else if ( yaListGl2d . indexOf ( key ) === - 1 &&
84
+ yaListCartesian . indexOf ( key ) === - 1 &&
85
+ constants . yAxisMatch . test ( key ) ) {
86
+ yaListCartesian . push ( key ) ;
87
+ }
88
+ }
62
89
}
63
90
64
- if ( layoutOut . _hasCartesian || layoutOut . _hasGL2D || ! fullData . length ) {
65
- // make sure there's at least one of each and lists are sorted
66
- if ( ! xaList . length ) xaList = [ 'xaxis' ] ;
67
- else xaList . sort ( axSort ) ;
91
+ // make sure that plots with orphan cartesian axes
92
+ // are considered 'cartesian'
93
+ if ( xaListCartesian . length && yaListCartesian . length ) {
94
+ layoutOut . _hasCartesian = true ;
95
+ }
68
96
69
- if ( ! yaList . length ) yaList = [ 'yaxis' ] ;
70
- else yaList . sort ( axSort ) ;
97
+ function axSort ( a , b ) {
98
+ var aNum = Number ( a . substr ( 5 ) || 1 ) ,
99
+ bNum = Number ( b . substr ( 5 ) || 1 ) ;
100
+ return aNum - bNum ;
71
101
}
72
102
73
- xaList . concat ( yaList ) . forEach ( function ( axName ) {
103
+ var xaList = xaListCartesian . concat ( xaListGl2d ) . sort ( axSort ) ,
104
+ yaList = yaListCartesian . concat ( yaListGl2d ) . sort ( axSort ) ;
105
+
106
+ xaList . concat ( yaList ) . forEach ( function ( axName ) {
74
107
var axLetter = axName . charAt ( 0 ) ,
75
108
axLayoutIn = layoutIn [ axName ] || { } ,
76
109
axLayoutOut = { } ,
@@ -100,7 +133,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
100
133
101
134
// so we don't have to repeat autotype unnecessarily,
102
135
// copy an autotype back to layoutIn
103
- if ( ! layoutIn [ axName ] && axLayoutIn . type !== '-' ) {
136
+ if ( ! layoutIn [ axName ] && axLayoutIn . type !== '-' ) {
104
137
layoutIn [ axName ] = { type : axLayoutIn . type } ;
105
138
}
106
139
0 commit comments