Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 03254ab

Browse files
committed
revise minor auto ticks
1 parent db7534b commit 03254ab

File tree

4 files changed

+67
-122
lines changed

4 files changed

+67
-122
lines changed

src/plots/cartesian/axes.js

Lines changed: 67 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {
12081203
axes.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(/%[uVW]/.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(/%[uVW]/.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

test/image/baselines/28.png

49 Bytes
Loading
38 Bytes
Loading
18.2 KB
Loading

0 commit comments

Comments
 (0)