@@ -541,21 +541,17 @@ function autoShiftMonthBins(binStart, data, dtick, dataMin, calendar) {
541
541
// ----------------------------------------------------
542
542
543
543
// 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 ;
551
547
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
+ }
556
552
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' ) ;
559
555
}
560
556
} ;
561
557
@@ -582,10 +578,11 @@ axes.prepTicks = function(ax, opts) {
582
578
if ( ax . _name === 'radialaxis' ) nt *= 2 ;
583
579
}
584
580
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
+ }
589
586
590
587
ax . _roughDTick = Math . abs ( rng [ 1 ] - rng [ 0 ] ) / nt ;
591
588
axes . autoTicks ( ax , ax . _roughDTick ) ;
@@ -840,14 +837,12 @@ axes.calcTicks = function calcTicks(ax, opts) {
840
837
if ( isMinor ) {
841
838
if ( ! ax . minor . dtick ) {
842
839
mockAx . _majorDtick = ax . dtick ;
843
-
844
840
mockAx . dtick = mockAx . _dtickInit ;
845
- mockAx . tick0 = mockAx . _tick0Init ;
846
841
}
847
842
}
848
843
849
844
if ( isMinor ) {
850
- axes . prepMinorTicks ( mockAx , opts ) ;
845
+ axes . prepMinorTicks ( mockAx ) ;
851
846
} else {
852
847
axes . prepTicks ( mockAx , opts ) ;
853
848
}
@@ -1208,90 +1203,6 @@ function roundDTick(roughDTick, base, roundingSet) {
1208
1203
axes . autoTicks = function ( ax , roughDTick , isMinor ) {
1209
1204
var majorDtick = ax . _majorDtick ;
1210
1205
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
-
1295
1206
var base ;
1296
1207
1297
1208
function getBase ( v ) {
@@ -1301,6 +1212,8 @@ axes.autoTicks = function(ax, roughDTick, isMinor) {
1301
1212
if ( ax . type === 'date' ) {
1302
1213
ax . tick0 = Lib . dateTick0 ( ax . calendar , 0 ) ;
1303
1214
1215
+ var _roundDays = ax . _hasDayOfWeekBreaks ? [ 1 , 2 , 7 , 14 ] : roundDays ;
1216
+
1304
1217
// the criteria below are all based on the rough spacing we calculate
1305
1218
// being > half of the final unit - so precalculate twice the rough val
1306
1219
var roughX2 = 2 * roughDTick ;
@@ -1313,21 +1226,23 @@ axes.autoTicks = function(ax, roughDTick, isMinor) {
1313
1226
roughDTick /= ONEAVGMONTH ;
1314
1227
ax . dtick = 'M' + roundDTick ( roughDTick , 1 , roundBase24 ) ;
1315
1228
} 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
+ }
1329
1243
1330
- if ( isPeriod ) ax . _dowTick0 = ax . tick0 ;
1244
+ if ( isPeriod ) ax . _dowTick0 = ax . tick0 ;
1245
+ }
1331
1246
} else if ( roughX2 > ONEHOUR ) {
1332
1247
ax . dtick = roundDTick ( roughDTick , ONEHOUR , roundBase24 ) ;
1333
1248
} else if ( roughX2 > ONEMIN ) {
@@ -1339,6 +1254,40 @@ axes.autoTicks = function(ax, roughDTick, isMinor) {
1339
1254
base = getBase ( 10 ) ;
1340
1255
ax . dtick = roundDTick ( roughDTick , base , roundBase10 ) ;
1341
1256
}
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
+ }
1342
1291
} else if ( ax . type === 'log' ) {
1343
1292
ax . tick0 = 0 ;
1344
1293
var rng = Lib . simpleMap ( ax . range , ax . r2l ) ;
@@ -1375,10 +1324,6 @@ axes.autoTicks = function(ax, roughDTick, isMinor) {
1375
1324
ax . dtick = roundDTick ( roughDTick , base , roundBase10 ) ;
1376
1325
}
1377
1326
1378
- if ( isMinor && ax . dtick * 10 === majorDtick ) {
1379
- ax . dtick *= 2 ;
1380
- }
1381
-
1382
1327
// prevent infinite loops
1383
1328
if ( ax . dtick === 0 ) ax . dtick = 1 ;
1384
1329
0 commit comments