@@ -20,28 +20,36 @@ var axisIds = require('./axis_ids');
2020
2121
2222module . exports = function supplyLayoutDefaults ( layoutIn , layoutOut , fullData ) {
23- // get the full list of axes already defined
2423 var layoutKeys = Object . keys ( layoutIn ) ,
25- xaList = [ ] ,
26- yaList = [ ] ,
24+ xaListCartesian = [ ] ,
25+ yaListCartesian = [ ] ,
26+ xaListGl2d = [ ] ,
27+ yaListGl2d = [ ] ,
2728 outerTicks = { } ,
2829 noGrids = { } ,
2930 i ;
3031
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
3733 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 ) ,
4048 yaName = axisIds . id2name ( trace . yaxis ) ;
4149
4250 // 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 ) ;
4553
4654 // check for default formatting tweaks
4755 if ( Plots . traceIs ( trace , '2dMap' ) ) {
@@ -55,22 +63,47 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
5563 }
5664 }
5765
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+ }
6289 }
6390
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+ }
6896
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 ;
71101 }
72102
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 ) {
74107 var axLetter = axName . charAt ( 0 ) ,
75108 axLayoutIn = layoutIn [ axName ] || { } ,
76109 axLayoutOut = { } ,
@@ -100,7 +133,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
100133
101134 // so we don't have to repeat autotype unnecessarily,
102135 // copy an autotype back to layoutIn
103- if ( ! layoutIn [ axName ] && axLayoutIn . type !== '-' ) {
136+ if ( ! layoutIn [ axName ] && axLayoutIn . type !== '-' ) {
104137 layoutIn [ axName ] = { type : axLayoutIn . type } ;
105138 }
106139
0 commit comments