@@ -541,21 +541,17 @@ function autoShiftMonthBins(binStart, data, dtick, dataMin, calendar) {
541541// ----------------------------------------------------
542542
543543// ensure we have minor tick0 and dtick calculated
544- axes . prepMinorTicks = function ( ax , opts ) {
545- var rng = Lib . simpleMap ( ax . range , ax . r2l , undefined , undefined , opts ) ;
546-
547- // calculate max number of (auto) ticks to display based on plot size
548- if ( ax . tickmode === 'auto' || ! ax . dtick ) {
549- var nt = ax . nticks ;
550- var minPx ;
544+ axes . prepMinorTicks = function ( ax ) {
545+ var majorDtick = ax . _majorDtick ;
546+ var dist = majorDtick ;
551547
552- if ( ! nt ) {
553- minPx = ax . _id . charAt ( 0 ) === 'y' ? 40 : 80 ;
554- nt = Lib . constrain ( ax . _length / minPx , 4 , 9 ) + 1 ;
555- }
548+ if ( ax . type === 'date' && typeof majorDtick === 'string' && majorDtick . charAt ( 0 ) === 'M' ) {
549+ var months = Number ( majorDtick . substring ( 1 ) ) ;
550+ dist = months * ONEAVGMONTH ;
551+ }
556552
557- ax . _roughDTick = Math . abs ( rng [ 1 ] - rng [ 0 ] ) / nt ;
558- axes . autoTicks ( ax , ax . _roughDTick , 'minor' ) ;
553+ if ( ax . tickmode === 'auto' || ! ax . dtick ) {
554+ axes . autoTicks ( ax , dist / 7 , 'minor' ) ;
559555 }
560556} ;
561557
@@ -582,10 +578,11 @@ axes.prepTicks = function(ax, opts) {
582578 if ( ax . _name === 'radialaxis' ) nt *= 2 ;
583579 }
584580
585- // add a couple of extra digits for filling in ticks when we
586- // have explicit tickvals without tick text
587- if ( ax . tickmode === 'array' ) nt *= 100 ;
588-
581+ if ( ! ( ax . minor && ax . minor . tickmode !== 'array' ) ) {
582+ // add a couple of extra digits for filling in ticks when we
583+ // have explicit tickvals without tick text
584+ if ( ax . tickmode === 'array' ) nt *= 100 ;
585+ }
589586
590587 ax . _roughDTick = Math . abs ( rng [ 1 ] - rng [ 0 ] ) / nt ;
591588 axes . autoTicks ( ax , ax . _roughDTick ) ;
@@ -840,14 +837,12 @@ axes.calcTicks = function calcTicks(ax, opts) {
840837 if ( isMinor ) {
841838 if ( ! ax . minor . dtick ) {
842839 mockAx . _majorDtick = ax . dtick ;
843-
844840 mockAx . dtick = mockAx . _dtickInit ;
845- mockAx . tick0 = mockAx . _tick0Init ;
846841 }
847842 }
848843
849844 if ( isMinor ) {
850- axes . prepMinorTicks ( mockAx , opts ) ;
845+ axes . prepMinorTicks ( mockAx ) ;
851846 } else {
852847 axes . prepTicks ( mockAx , opts ) ;
853848 }
@@ -1208,90 +1203,6 @@ function roundDTick(roughDTick, base, roundingSet) {
12081203axes . autoTicks = function ( ax , roughDTick , isMinor ) {
12091204 var majorDtick = ax . _majorDtick ;
12101205
1211- if ( isMinor && ax . type === 'date' ) {
1212- if ( typeof majorDtick === 'string' && majorDtick . charAt ( 0 ) === 'M' ) {
1213- var months = Number ( majorDtick . substring ( 1 ) ) ;
1214-
1215- if ( months > 12 ) {
1216- ax . dtick = 'M12' ;
1217- return ;
1218- }
1219-
1220- if ( months === 12 ) {
1221- ax . dtick = 'M3' ;
1222- return ;
1223- }
1224-
1225- if ( months > 1 ) {
1226- ax . dtick = 'M1' ;
1227- return ;
1228- }
1229-
1230- if ( months === 1 ) {
1231- ax . dtick = 'M1' ; // not using week in this case
1232- return ;
1233- }
1234- } else {
1235- var weeks = majorDtick / ONEWEEK ;
1236-
1237- if ( weeks > 52 ) {
1238- ax . dtick = 'M12' ;
1239- return ;
1240- }
1241-
1242- if ( weeks > 4 ) {
1243- ax . dtick = 'M1' ;
1244- return ;
1245- }
1246-
1247- if ( weeks > 1 ) {
1248- ax . dtick = ONEWEEK ;
1249- return ;
1250- }
1251-
1252- var days = majorDtick / ONEDAY ;
1253-
1254- if ( days > 1 ) {
1255- ax . dtick = ONEDAY ;
1256- return ;
1257- }
1258-
1259- var hours = majorDtick / ONEHOUR ;
1260-
1261- if ( hours > 12 ) {
1262- ax . dtick = 12 * ONEHOUR ;
1263- return ;
1264- }
1265-
1266- if ( hours > 6 ) {
1267- ax . dtick = 6 * ONEHOUR ;
1268- return ;
1269- }
1270-
1271- if ( hours > 3 ) {
1272- ax . dtick = 3 * ONEHOUR ;
1273- return ;
1274- }
1275-
1276- if ( hours > 1 ) {
1277- ax . dtick = ONEHOUR ;
1278- return ;
1279- }
1280-
1281- if ( hours === 1 ) {
1282- ax . dtick = 0.5 * ONEHOUR ;
1283- return ;
1284- }
1285-
1286- if ( hours === 0.5 ) {
1287- ax . dtick = 0.25 * ONEHOUR ;
1288- return ;
1289- }
1290- }
1291- }
1292-
1293- if ( isMinor ) roughDTick /= 5 ;
1294-
12951206 var base ;
12961207
12971208 function getBase ( v ) {
@@ -1301,6 +1212,8 @@ axes.autoTicks = function(ax, roughDTick, isMinor) {
13011212 if ( ax . type === 'date' ) {
13021213 ax . tick0 = Lib . dateTick0 ( ax . calendar , 0 ) ;
13031214
1215+ var _roundDays = ax . _hasDayOfWeekBreaks ? [ 1 , 2 , 7 , 14 ] : roundDays ;
1216+
13041217 // the criteria below are all based on the rough spacing we calculate
13051218 // being > half of the final unit - so precalculate twice the rough val
13061219 var roughX2 = 2 * roughDTick ;
@@ -1313,21 +1226,23 @@ axes.autoTicks = function(ax, roughDTick, isMinor) {
13131226 roughDTick /= ONEAVGMONTH ;
13141227 ax . dtick = 'M' + roundDTick ( roughDTick , 1 , roundBase24 ) ;
13151228 } else if ( roughX2 > ONEDAY ) {
1316- ax . dtick = roundDTick ( roughDTick , ONEDAY , ax . _hasDayOfWeekBreaks ? [ 1 , 2 , 7 , 14 ] : roundDays ) ;
1317- // get week ticks on sunday
1318- // this will also move the base tick off 2000-01-01 if dtick is
1319- // 2 or 3 days... but that's a weird enough case that we'll ignore it.
1320- var tickformat = axes . getTickFormat ( ax ) ;
1321- var isPeriod = ax . ticklabelmode === 'period' ;
1322- if ( isPeriod ) ax . _rawTick0 = ax . tick0 ;
1323-
1324- if ( / % [ u V W ] / . test ( tickformat ) ) {
1325- ax . tick0 = Lib . dateTick0 ( ax . calendar , 2 ) ; // Monday
1326- } else {
1327- ax . tick0 = Lib . dateTick0 ( ax . calendar , 1 ) ; // Sunday
1328- }
1229+ ax . dtick = roundDTick ( roughDTick , ONEDAY , _roundDays ) ;
1230+ if ( ! isMinor ) {
1231+ // get week ticks on sunday
1232+ // this will also move the base tick off 2000-01-01 if dtick is
1233+ // 2 or 3 days... but that's a weird enough case that we'll ignore it.
1234+ var tickformat = axes . getTickFormat ( ax ) ;
1235+ var isPeriod = ax . ticklabelmode === 'period' ;
1236+ if ( isPeriod ) ax . _rawTick0 = ax . tick0 ;
1237+
1238+ if ( / % [ u V W ] / . test ( tickformat ) ) {
1239+ ax . tick0 = Lib . dateTick0 ( ax . calendar , 2 ) ; // Monday
1240+ } else {
1241+ ax . tick0 = Lib . dateTick0 ( ax . calendar , 1 ) ; // Sunday
1242+ }
13291243
1330- if ( isPeriod ) ax . _dowTick0 = ax . tick0 ;
1244+ if ( isPeriod ) ax . _dowTick0 = ax . tick0 ;
1245+ }
13311246 } else if ( roughX2 > ONEHOUR ) {
13321247 ax . dtick = roundDTick ( roughDTick , ONEHOUR , roundBase24 ) ;
13331248 } else if ( roughX2 > ONEMIN ) {
@@ -1339,6 +1254,40 @@ axes.autoTicks = function(ax, roughDTick, isMinor) {
13391254 base = getBase ( 10 ) ;
13401255 ax . dtick = roundDTick ( roughDTick , base , roundBase10 ) ;
13411256 }
1257+
1258+ if ( isMinor ) {
1259+ if (
1260+ typeof majorDtick === 'string' &&
1261+ majorDtick . charAt ( 0 ) === 'M'
1262+ ) {
1263+ if ( majorDtick === 'M24' ) {
1264+ ax . dtick = 'M12' ;
1265+ }
1266+
1267+ if ( majorDtick === 'M12' ) {
1268+ ax . dtick = 'M3' ;
1269+ }
1270+
1271+ if ( typeof ax . dtick !== 'string' ) {
1272+ ax . dtick = 'M1' ;
1273+ }
1274+ }
1275+
1276+ if ( majorDtick > ONEDAY ) {
1277+ if ( majorDtick === 14 * ONEDAY ) ax . dtick = 7 * ONEDAY ;
1278+ else {
1279+ var v = roundDTick ( majorDtick , ONEDAY , _roundDays ) ;
1280+ if ( v >= majorDtick ) {
1281+ v = roundDTick ( majorDtick / 7 , ONEDAY , _roundDays ) ;
1282+ }
1283+
1284+ if ( ( majorDtick / ONEDAY ) % ( v / ONEDAY ) ) {
1285+ v = ONEDAY ;
1286+ }
1287+ ax . dtick = v ;
1288+ }
1289+ }
1290+ }
13421291 } else if ( ax . type === 'log' ) {
13431292 ax . tick0 = 0 ;
13441293 var rng = Lib . simpleMap ( ax . range , ax . r2l ) ;
@@ -1375,10 +1324,6 @@ axes.autoTicks = function(ax, roughDTick, isMinor) {
13751324 ax . dtick = roundDTick ( roughDTick , base , roundBase10 ) ;
13761325 }
13771326
1378- if ( isMinor && ax . dtick * 10 === majorDtick ) {
1379- ax . dtick *= 2 ;
1380- }
1381-
13821327 // prevent infinite loops
13831328 if ( ax . dtick === 0 ) ax . dtick = 1 ;
13841329
0 commit comments