@@ -951,6 +951,13 @@ axes.calcTicks = function calcTicks(ax, opts) {
951951 continue ;
952952 }
953953
954+ // fill tickVals based on overlaying axis
955+ if ( mockAx . tickmode === 'sync' ) {
956+ tickVals = [ ] ;
957+ ticksOut = syncTicks ( ax ) ;
958+ continue ;
959+ }
960+
954961 // add a tiny bit so we get ticks which may have rounded out
955962 var exRng = expandRange ( rng ) ;
956963 var startTick = exRng [ 0 ] ;
@@ -1203,6 +1210,51 @@ axes.calcTicks = function calcTicks(ax, opts) {
12031210 return ticksOut ;
12041211} ;
12051212
1213+ function filterRangeBreaks ( ax , ticksOut ) {
1214+ if ( ax . rangebreaks ) {
1215+ // remove ticks falling inside rangebreaks
1216+ ticksOut = ticksOut . filter ( function ( d ) {
1217+ return ax . maskBreaks ( d . x ) !== BADNUM ;
1218+ } ) ;
1219+ }
1220+
1221+ return ticksOut ;
1222+ }
1223+
1224+ function syncTicks ( ax ) {
1225+ // get the overlaying axis
1226+ var baseAxis = ax . _mainAxis ;
1227+
1228+ var ticksOut = [ ] ;
1229+ if ( baseAxis . _vals ) {
1230+ for ( var i = 0 ; i < baseAxis . _vals . length ; i ++ ) {
1231+ // filter vals with noTick flag
1232+ if ( baseAxis . _vals [ i ] . noTick ) {
1233+ continue ;
1234+ }
1235+
1236+ // get the position of the every tick
1237+ var pos = baseAxis . l2p ( baseAxis . _vals [ i ] . x ) ;
1238+
1239+ // get the tick for the current axis based on position
1240+ var vali = ax . p2l ( pos ) ;
1241+ var obj = axes . tickText ( ax , vali ) ;
1242+
1243+ // assign minor ticks
1244+ if ( baseAxis . _vals [ i ] . minor ) {
1245+ obj . minor = true ;
1246+ obj . text = '' ;
1247+ }
1248+
1249+ ticksOut . push ( obj ) ;
1250+ }
1251+ }
1252+
1253+ ticksOut = filterRangeBreaks ( ax , ticksOut ) ;
1254+
1255+ return ticksOut ;
1256+ }
1257+
12061258function arrayTicks ( ax ) {
12071259 var rng = Lib . simpleMap ( ax . range , ax . r2l ) ;
12081260 var exRng = expandRange ( rng ) ;
@@ -1249,12 +1301,7 @@ function arrayTicks(ax) {
12491301 }
12501302 }
12511303
1252- if ( ax . rangebreaks ) {
1253- // remove ticks falling inside rangebreaks
1254- ticksOut = ticksOut . filter ( function ( d ) {
1255- return ax . maskBreaks ( d . x ) !== BADNUM ;
1256- } ) ;
1257- }
1304+ ticksOut = filterRangeBreaks ( ax , ticksOut ) ;
12581305
12591306 return ticksOut ;
12601307}
@@ -2256,6 +2303,18 @@ axes.draw = function(gd, arg, opts) {
22562303 return ax . overlaying ;
22572304 } ) ;
22582305
2306+ // order axes that have dependency to other axes
2307+ axList . map ( function ( axId ) {
2308+ var ax = axes . getFromId ( gd , axId ) ;
2309+
2310+ if ( ax . tickmode === 'sync' && ax . overlaying ) {
2311+ var overlayingIndex = axList . findIndex ( function ( axis ) { return axis === ax . overlaying ; } ) ;
2312+
2313+ if ( overlayingIndex >= 0 ) {
2314+ axList . unshift ( axList . splice ( overlayingIndex , 1 ) . shift ( ) ) ;
2315+ }
2316+ }
2317+ } ) ;
22592318
22602319 var axShifts = { 'false' : { 'left' : 0 , 'right' : 0 } } ;
22612320
@@ -3247,6 +3306,11 @@ axes.drawTicks = function(gd, ax, opts) {
32473306axes . drawGrid = function ( gd , ax , opts ) {
32483307 opts = opts || { } ;
32493308
3309+ if ( ax . tickmode === 'sync' ) {
3310+ // for tickmode sync we use the overlaying axis grid
3311+ return ;
3312+ }
3313+
32503314 var cls = ax . _id + 'grid' ;
32513315
32523316 var hasMinor = ax . minor && ax . minor . showgrid ;
0 commit comments