From 1a09b58d1a1712a5de49f0a4b87abfc7ddb92d98 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 12:14:44 -0400 Subject: [PATCH 01/24] center weekly labels on weekend rangebreaks --- src/plots/cartesian/axes.js | 7 ++-- test/jasmine/tests/axes_test.js | 61 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 26e73e7b0cf..34f75c03479 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -777,13 +777,13 @@ axes.calcTicks = function calcTicks(ax, opts) { var A = tickVals[a].value; var B = tickVals[b].value; - var delta = definedDelta || Math.abs(B - A); + var actualDelta = Math.abs(B - A); + var delta = definedDelta || actualDelta; if(delta >= ONEDAY * 365) { // Years could have days less than ONEAVGYEAR period v += ONEAVGYEAR / 2; } else if(delta >= ONEAVGQUARTER) { v += ONEAVGQUARTER / 2; } else if(delta >= ONEMINMONTH) { // Months could have days less than ONEAVGMONTH period - var actualDelta = Math.abs(B - A); if(actualDelta >= ONEMINMONTH && actualDelta <= ONEMAXMONTH) { v += actualDelta / 2; } else { @@ -791,6 +791,9 @@ axes.calcTicks = function calcTicks(ax, opts) { } } else if(delta >= ONEWEEK) { v += ONEWEEK / 2; + if(actualDelta === ONEWEEK && ax._hasDayOfWeekBreaks) { + v -= ONEDAY; // half of two days which is a good approximate for the number of week-end days + } } else if(delta >= ONEDAY) { v += ONEDAY / 2; } diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 1f9e9ca9781..48b3a7cf270 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5383,6 +5383,67 @@ describe('Test axes', function() { }); }); + ['%U', '%V', '%W'].forEach(function(tickformat, i) { + it('should move weekly labels by one day (i.e. to help center the labels) when *day of week* rangebreak is present', function(done) { + Plotly.newPlot(gd, { + data: [{ + x: [ + '2020-01-01', + '2020-01-02', + '2020-01-03', + '2020-01-04', + '2020-01-05', + '2020-01-06', + '2020-01-07', + '2020-01-08', + '2020-01-09', + '2020-01-10', + '2020-01-11', + '2020-01-12', + '2020-01-13', + '2020-01-14', + '2020-01-15', + '2020-01-16', + '2020-01-17', + '2020-01-18', + '2020-01-19', + '2020-01-20', + '2020-01-21', + '2020-01-22', + '2020-01-23', + '2020-01-24', + '2020-01-25', + '2020-01-26', + '2020-01-27', + '2020-01-28', + '2020-01-29', + '2020-01-30', + '2020-01-31' + ] + }], + layout: { + width: 1000, + xaxis: { + rangebreaks: [{bounds: ['sat', 'mon']}], + ticklabelmode: 'period', + tickformat: '%b-' + tickformat + } + } + }) + .then(function() { + _assert('', [ + '2020-01-01 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00' + ], [ + ['Dec-52', 'Jan-01', 'Jan-02', 'Jan-03', 'Jan-04'], + ['Dec-01', 'Jan-02', 'Jan-03', 'Jan-04', 'Jan-05'], + ['Dec-52', 'Jan-01', 'Jan-02', 'Jan-03', 'Jan-04'] + ][i]); + }) + .catch(failTest) + .then(done); + }); + }); + ['%A', '%a', '%d', '%e', '%j', '%u', '%w', '%x'].forEach(function(tickformat, i) { it('should respect daily tickformat that includes ' + tickformat, function(done) { Plotly.newPlot(gd, { From 9fce7adc792f9fd310ecd2179624562635dd56ab Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 14:20:25 -0400 Subject: [PATCH 02/24] improve quarters and year period label positioning --- src/constants/numerical.js | 6 +++- src/plots/cartesian/axes.js | 22 ++++++++++--- test/image/baselines/date_axes_period2.png | Bin 38079 -> 38074 bytes test/jasmine/tests/axes_test.js | 36 ++++++++++----------- 4 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/constants/numerical.js b/src/constants/numerical.js index 17111ce1a6d..a5c97e85497 100644 --- a/src/constants/numerical.js +++ b/src/constants/numerical.js @@ -31,13 +31,17 @@ module.exports = { * to remind us that not all years and months * have the same length */ + ONEMAXYEAR: 31622400000, // 366 * ONEDAY ONEAVGYEAR: 31557600000, // 365.25 days + ONEMINYEAR: 31536000000, // 365 * ONEDAY + ONEMAXQUARTER: 7948800000, // 92 * ONEDAY ONEAVGQUARTER: 7889400000, // 1/4 of ONEAVGYEAR + ONEMINQUARTER: 7776000000, // 90 * ONEDAY ONEMAXMONTH: 2678400000, // 31 * ONEDAY ONEAVGMONTH: 2629800000, // 1/12 of ONEAVGYEAR ONEMINMONTH: 2419200000, // 28 * ONEDAY ONEWEEK: 604800000, // 7 * ONEDAY - ONEDAY: 86400000, + ONEDAY: 86400000, // 24 * ONEHOUR ONEHOUR: 3600000, ONEMIN: 60000, ONESEC: 1000, diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 34f75c03479..cd52009c402 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -23,8 +23,12 @@ var axAttrs = require('./layout_attributes'); var cleanTicks = require('./clean_ticks'); var constants = require('../../constants/numerical'); +var ONEMAXYEAR = constants.ONEMAXYEAR; var ONEAVGYEAR = constants.ONEAVGYEAR; +var ONEMINYEAR = constants.ONEMINYEAR; +var ONEMAXQUARTER = constants.ONEMAXQUARTER; var ONEAVGQUARTER = constants.ONEAVGQUARTER; +var ONEMINQUARTER = constants.ONEMINQUARTER; var ONEMAXMONTH = constants.ONEMAXMONTH; var ONEAVGMONTH = constants.ONEAVGMONTH; var ONEMINMONTH = constants.ONEMINMONTH; @@ -779,11 +783,19 @@ axes.calcTicks = function calcTicks(ax, opts) { var actualDelta = Math.abs(B - A); var delta = definedDelta || actualDelta; - if(delta >= ONEDAY * 365) { // Years could have days less than ONEAVGYEAR period - v += ONEAVGYEAR / 2; - } else if(delta >= ONEAVGQUARTER) { - v += ONEAVGQUARTER / 2; - } else if(delta >= ONEMINMONTH) { // Months could have days less than ONEAVGMONTH period + if(delta >= ONEMINYEAR) { + if(actualDelta >= ONEMINYEAR && actualDelta <= ONEMAXYEAR) { + v += actualDelta / 2; + } else { + v += ONEAVGYEAR / 2; + } + } else if(delta >= ONEMINQUARTER) { + if(actualDelta >= ONEMINQUARTER && actualDelta <= ONEMAXQUARTER) { + v += actualDelta / 2; + } else { + v += ONEAVGQUARTER / 2; + } + } else if(delta >= ONEMINMONTH) { if(actualDelta >= ONEMINMONTH && actualDelta <= ONEMAXMONTH) { v += actualDelta / 2; } else { diff --git a/test/image/baselines/date_axes_period2.png b/test/image/baselines/date_axes_period2.png index c7882225fdca9d572df6bec5deb997e776a94d43..808786263fee9a51a37d7045039956aee868b3b4 100644 GIT binary patch literal 38074 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 literal 38079 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 diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 48b3a7cf270..3d67f7a8e02 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5232,14 +5232,14 @@ describe('Test axes', function() { }) .then(function() { _assert('', [ - '2019-07-02 15:00', - '2020-07-01 15:00', - '2021-07-02 15:00', - '2022-07-02 15:00', - '2023-07-02 15:00', - '2024-07-01 15:00', - '2025-07-02 15:00', - '2026-07-02 15:00' + '2019-07-02 12:00', + '2020-07-02', + '2021-07-02 12:00', + '2022-07-02 12:00', + '2023-07-02 12:00', + '2024-07-02', + '2025-07-02 12:00', + '2026-07-02 12:00' ], [ ['', '2020', '2021', '2022', '2023', '2024', '2025', ''], ['', '20', '21', '22', '23', '24', '25', ''] @@ -5265,16 +5265,16 @@ describe('Test axes', function() { }) .then(function() { _assert('', [ - '2019-11-15 15:45', - '2020-02-15 15:45', - '2020-05-16 15:45', - '2020-08-15 15:45', - '2020-11-15 15:45', - '2021-02-15 15:45', - '2021-05-16 15:45', - '2021-08-15 15:45', - '2021-11-15 15:45', - '2022-02-15 15:45' + '2019-11-16', + '2020-02-15 12:00', + '2020-05-16 12:00', + '2020-08-16', + '2020-11-16', + '2021-02-15', + '2021-05-16 12:00', + '2021-08-16', + '2021-11-16', + '2022-02-16' ], ['', '2020-1', '2020-2', '2020-3', '2020-4', '2021-1', '2021-2', '2021-3', '2021-4', '']); }) .catch(failTest) From 8928851519e1b74dda977cc574abaa9162820d2c Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 15:54:35 -0400 Subject: [PATCH 03/24] reduce min quarter constant for the edge case of Feb-Mar-Apr --- src/constants/numerical.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constants/numerical.js b/src/constants/numerical.js index a5c97e85497..b7b497c7b97 100644 --- a/src/constants/numerical.js +++ b/src/constants/numerical.js @@ -36,7 +36,7 @@ module.exports = { ONEMINYEAR: 31536000000, // 365 * ONEDAY ONEMAXQUARTER: 7948800000, // 92 * ONEDAY ONEAVGQUARTER: 7889400000, // 1/4 of ONEAVGYEAR - ONEMINQUARTER: 7776000000, // 90 * ONEDAY + ONEMINQUARTER: 7689600000, // 89 * ONEDAY ONEMAXMONTH: 2678400000, // 31 * ONEDAY ONEAVGMONTH: 2629800000, // 1/12 of ONEAVGYEAR ONEMINMONTH: 2419200000, // 28 * ONEDAY From ea6eca1998614364a1554b53a7e6403621b435ec Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 16:21:49 -0400 Subject: [PATCH 04/24] add logic for special case of weeks and quarters --- src/plots/cartesian/axes.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index cd52009c402..579c0b8e514 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -790,7 +790,10 @@ axes.calcTicks = function calcTicks(ax, opts) { v += ONEAVGYEAR / 2; } } else if(delta >= ONEMINQUARTER) { - if(actualDelta >= ONEMINQUARTER && actualDelta <= ONEMAXQUARTER) { + if( + definedDelta && // case of specified by tickfomat + actualDelta >= ONEMINQUARTER && actualDelta <= ONEMAXQUARTER + ) { v += actualDelta / 2; } else { v += ONEAVGQUARTER / 2; @@ -803,8 +806,11 @@ axes.calcTicks = function calcTicks(ax, opts) { } } else if(delta >= ONEWEEK) { v += ONEWEEK / 2; - if(actualDelta === ONEWEEK && ax._hasDayOfWeekBreaks) { - v -= ONEDAY; // half of two days which is a good approximate for the number of week-end days + if( + definedDelta && // case of specified by tickfomat + actualDelta === ONEWEEK && ax._hasDayOfWeekBreaks + ) { + v -= ONEDAY; // half of two days which is a good approximation for the number of week-end days } } else if(delta >= ONEDAY) { v += ONEDAY / 2; From 37a08402b71de6d8a80ada549f8d606eb34cdea6 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 16:29:55 -0400 Subject: [PATCH 05/24] use tickfromat getter and add question comment --- src/plots/cartesian/axes.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 579c0b8e514..10bc98ac635 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -702,9 +702,10 @@ axes.calcTicks = function calcTicks(ax, opts) { var maxRange = Math.max(rng[0], rng[1]); var definedDelta; - if(isPeriod && ax.tickformat) { + var tickformat = axes.getTickFormat(ax); // don't use ax.tickformat directly + if(isPeriod) { if( - !(/%[fLQsSMHIpX]/.test(ax.tickformat)) + !(/%[fLQsSMHIpX]/.test(tickformat)) // %f: microseconds as a decimal number [000000, 999999] // %L: milliseconds as a decimal number [000, 999] // %Q: milliseconds since UNIX epoch @@ -717,7 +718,7 @@ axes.calcTicks = function calcTicks(ax, opts) { // %X: the locale’s time, such as %-I:%M:%S %p ) { if( - /%[Aadejuwx]/.test(ax.tickformat) + /%[Aadejuwx]/.test(tickformat) // %A: full weekday name // %a: abbreviated weekday name // %d: zero-padded day of the month as a decimal number [01,31] @@ -728,23 +729,23 @@ axes.calcTicks = function calcTicks(ax, opts) { // %x: the locale’s date, such as %-m/%-d/%Y ) definedDelta = ONEDAY; else if( - /%[UVW]/.test(ax.tickformat) + /%[UVW]/.test(tickformat) // %U: Sunday-based week of the year as a decimal number [00,53] // %V: ISO 8601 week of the year as a decimal number [01, 53] // %W: Monday-based week of the year as a decimal number [00,53] ) definedDelta = ONEWEEK; else if( - /%[Bbm]/.test(ax.tickformat) + /%[Bbm]/.test(tickformat) // %B: full month name // %b: abbreviated month name // %m: month as a decimal number [01,12] ) definedDelta = ONEAVGMONTH; else if( - /%[q]/.test(ax.tickformat) + /%[q]/.test(tickformat) // %q: quarter of the year as a decimal number [1,4] ) definedDelta = ONEAVGQUARTER; else if( - /%[Yy]/.test(ax.tickformat) + /%[Yy]/.test(tickformat) // %Y: year with century as a decimal number, such as 1999 // %y: year without century as a decimal number [00,99] ) definedDelta = ONEAVGYEAR; @@ -945,7 +946,7 @@ axes.autoTicks = function(ax, roughDTick) { // 2 or 3 days... but that's a weird enough case that we'll ignore it. ax.tick0 = Lib.dateTick0(ax.calendar, true); - if(/%[uVW]/.test(ax.tickformat)) { + if(/%[uVW]/.test(ax.tickformat)) { // should we use axes.getTickFormat(ax) instead here? // replace Sunday with Monday for ISO and Monday-based formats var len = ax.tick0.length; var lastD = +ax.tick0[len - 1]; From e0bd026b66274360b1fdffa8c79fcd4a9bd659c7 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 17:08:52 -0400 Subject: [PATCH 06/24] more fixups for period tickformat --- src/plots/cartesian/axes.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 10bc98ac635..f1e568a62b3 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -702,8 +702,8 @@ axes.calcTicks = function calcTicks(ax, opts) { var maxRange = Math.max(rng[0], rng[1]); var definedDelta; - var tickformat = axes.getTickFormat(ax); // don't use ax.tickformat directly - if(isPeriod) { + var tickformat = axes.getTickFormat(ax); + if(isPeriod && tickformat) { if( !(/%[fLQsSMHIpX]/.test(tickformat)) // %f: microseconds as a decimal number [000000, 999999] @@ -946,7 +946,8 @@ axes.autoTicks = function(ax, roughDTick) { // 2 or 3 days... but that's a weird enough case that we'll ignore it. ax.tick0 = Lib.dateTick0(ax.calendar, true); - if(/%[uVW]/.test(ax.tickformat)) { // should we use axes.getTickFormat(ax) instead here? + var tickformat = axes.getTickFormat(ax); + if(/%[uVW]/.test(tickformat)) { // should we use axes.getTickFormat(ax) instead here? // replace Sunday with Monday for ISO and Monday-based formats var len = ax.tick0.length; var lastD = +ax.tick0[len - 1]; From 6fb01339897f3226fc46568e7d36d150a30ed736 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 17:36:54 -0400 Subject: [PATCH 07/24] remove comment --- src/plots/cartesian/axes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index f1e568a62b3..ca684db2cf0 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -947,7 +947,7 @@ axes.autoTicks = function(ax, roughDTick) { ax.tick0 = Lib.dateTick0(ax.calendar, true); var tickformat = axes.getTickFormat(ax); - if(/%[uVW]/.test(tickformat)) { // should we use axes.getTickFormat(ax) instead here? + if(/%[uVW]/.test(tickformat)) { // replace Sunday with Monday for ISO and Monday-based formats var len = ax.tick0.length; var lastD = +ax.tick0[len - 1]; From f907f2a3f8009f2180d7bcf00bcd31e17c4351f8 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 18:38:31 -0400 Subject: [PATCH 08/24] revise period lengths on axes with rangebreaks --- src/plots/cartesian/axes.js | 37 ++++++++++++++++++++------------- test/jasmine/tests/axes_test.js | 8 ++++--- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index ca684db2cf0..cf1dc993f8b 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -781,42 +781,49 @@ axes.calcTicks = function calcTicks(ax, opts) { var A = tickVals[a].value; var B = tickVals[b].value; - var actualDelta = Math.abs(B - A); var delta = definedDelta || actualDelta; + var periodLength = 0; + if(delta >= ONEMINYEAR) { if(actualDelta >= ONEMINYEAR && actualDelta <= ONEMAXYEAR) { - v += actualDelta / 2; + periodLength = actualDelta; } else { - v += ONEAVGYEAR / 2; + periodLength = ONEAVGYEAR; } } else if(delta >= ONEMINQUARTER) { if( definedDelta && // case of specified by tickfomat actualDelta >= ONEMINQUARTER && actualDelta <= ONEMAXQUARTER ) { - v += actualDelta / 2; + periodLength = actualDelta; } else { - v += ONEAVGQUARTER / 2; + periodLength = ONEAVGQUARTER; } } else if(delta >= ONEMINMONTH) { if(actualDelta >= ONEMINMONTH && actualDelta <= ONEMAXMONTH) { - v += actualDelta / 2; + periodLength = actualDelta; } else { - v += ONEAVGMONTH / 2; + periodLength = ONEAVGMONTH; } } else if(delta >= ONEWEEK) { - v += ONEWEEK / 2; - if( - definedDelta && // case of specified by tickfomat - actualDelta === ONEWEEK && ax._hasDayOfWeekBreaks - ) { - v -= ONEDAY; // half of two days which is a good approximation for the number of week-end days - } + periodLength = ONEWEEK; } else if(delta >= ONEDAY) { - v += ONEDAY / 2; + periodLength = ONEDAY; } + if(ax.rangebreaks) { + var nOut = 0; + var nAll = 2 * 3 * 5 * 7; // number of samples + for(var c = 0; c < nAll; c++) { + var r = c / nAll; + if(ax.maskBreaks(A * (1 - r) + B * r) === BADNUM) nOut++; + } + periodLength *= 1 - nOut / nAll; + } + + v += periodLength / 2; + ticksOut[i].periodX = v; if(v > maxRange || v < minRange) { // hide label if outside the range diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 3d67f7a8e02..d51ab49cfbb 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5432,9 +5432,11 @@ describe('Test axes', function() { }) .then(function() { _assert('', [ - '2020-01-01 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00' - ], [ - ['Dec-52', 'Jan-01', 'Jan-02', 'Jan-03', 'Jan-04'], + ['2019-12-31 04:24', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'], + ['2020-01-01 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'], + ['2020-01-01 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'] + ][i], [ + ['', 'Jan-01', 'Jan-02', 'Jan-03', 'Jan-04'], ['Dec-01', 'Jan-02', 'Jan-03', 'Jan-04', 'Jan-05'], ['Dec-52', 'Jan-01', 'Jan-02', 'Jan-03', 'Jan-04'] ][i]); From fa5d2e3d448c2e60f23c2f6e0968e0c2e5b49a3e Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 18:45:56 -0400 Subject: [PATCH 09/24] do not recalculate periodLength when zero --- src/plots/cartesian/axes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index cf1dc993f8b..9c8af00aebd 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -812,7 +812,7 @@ axes.calcTicks = function calcTicks(ax, opts) { periodLength = ONEDAY; } - if(ax.rangebreaks) { + if(periodLength && ax.rangebreaks) { var nOut = 0; var nAll = 2 * 3 * 5 * 7; // number of samples for(var c = 0; c < nAll; c++) { From b318e8b5c70244a8cc3f1af63fa6133db2b3d4ff Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 18:51:43 -0400 Subject: [PATCH 10/24] reduce sampling --- src/plots/cartesian/axes.js | 2 +- test/jasmine/tests/axes_test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 9c8af00aebd..84a536aa213 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -814,7 +814,7 @@ axes.calcTicks = function calcTicks(ax, opts) { if(periodLength && ax.rangebreaks) { var nOut = 0; - var nAll = 2 * 3 * 5 * 7; // number of samples + var nAll = 2 * 3 * 7; // number of samples for(var c = 0; c < nAll; c++) { var r = c / nAll; if(ax.maskBreaks(A * (1 - r) + B * r) === BADNUM) nOut++; diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index d51ab49cfbb..a950b29501a 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5432,7 +5432,7 @@ describe('Test axes', function() { }) .then(function() { _assert('', [ - ['2019-12-31 04:24', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'], + ['2019-12-31 04:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'], ['2020-01-01 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'], ['2020-01-01 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'] ][i], [ From beed352265254154e165ade9a89073d9564d8677 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 19 Aug 2020 19:58:05 -0400 Subject: [PATCH 11/24] should not move by a week or quarter when the labels are not weekly or quarterly --- src/plots/cartesian/axes.js | 11 +++-------- test/image/baselines/date_axes_period.png | Bin 40750 -> 40884 bytes 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 84a536aa213..57c67304907 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -791,14 +791,9 @@ axes.calcTicks = function calcTicks(ax, opts) { } else { periodLength = ONEAVGYEAR; } - } else if(delta >= ONEMINQUARTER) { - if( - definedDelta && // case of specified by tickfomat - actualDelta >= ONEMINQUARTER && actualDelta <= ONEMAXQUARTER - ) { + } else if(definedDelta === ONEAVGQUARTER && delta >= ONEMINQUARTER) { + if(actualDelta >= ONEMINQUARTER && actualDelta <= ONEMAXQUARTER) { periodLength = actualDelta; - } else { - periodLength = ONEAVGQUARTER; } } else if(delta >= ONEMINMONTH) { if(actualDelta >= ONEMINMONTH && actualDelta <= ONEMAXMONTH) { @@ -806,7 +801,7 @@ axes.calcTicks = function calcTicks(ax, opts) { } else { periodLength = ONEAVGMONTH; } - } else if(delta >= ONEWEEK) { + } else if(definedDelta === ONEWEEK && delta >= ONEWEEK) { periodLength = ONEWEEK; } else if(delta >= ONEDAY) { periodLength = ONEDAY; diff --git a/test/image/baselines/date_axes_period.png b/test/image/baselines/date_axes_period.png index 991ce21014bcfbf11a415738186b1ce657713e55..c335091cbec6d28159727250fb6e248ca224d452 100644 GIT binary patch literal 40884 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%0A$5X#=(na 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 g4Pzopr0Kl3ohX4Qo literal 40750 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

=2!;+ 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 I>zopr077r=F#rGn From 104ae5e807b1a69a9dfa43d83994298db5ef6b39 Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 20 Aug 2020 10:14:45 -0400 Subject: [PATCH 12/24] use formatter in the variable name of the entire tickformat --- test/jasmine/tests/axes_test.js | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index a950b29501a..a16b8040cd9 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5216,8 +5216,8 @@ describe('Test axes', function() { expect(labels).withContext(msg).toEqual(expLabels); } - ['%Y', '%y'].forEach(function(tickformat, i) { - it('should respect yearly tickformat that includes ' + tickformat, function(done) { + ['%Y', '%y'].forEach(function(formatter, i) { + it('should respect yearly tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ x: ['2020-01-01', '2026-01-01'] @@ -5226,7 +5226,7 @@ describe('Test axes', function() { width: 1000, xaxis: { ticklabelmode: 'period', - tickformat: tickformat + tickformat: formatter } } }) @@ -5281,8 +5281,8 @@ describe('Test axes', function() { .then(done); }); - ['%B', '%b', '%m'].forEach(function(tickformat, i) { - it('should respect monthly tickformat that includes ' + tickformat, function(done) { + ['%B', '%b', '%m'].forEach(function(formatter, i) { + it('should respect monthly tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ x: ['2020-01-01', '2020-07-01'] @@ -5291,7 +5291,7 @@ describe('Test axes', function() { width: 1000, xaxis: { ticklabelmode: 'period', - tickformat: '%q-' + tickformat + tickformat: '%q-' + formatter } } }) @@ -5347,8 +5347,8 @@ describe('Test axes', function() { .then(done); }); - ['%V', '%W'].forEach(function(tickformat, i) { - it('should respect Monday-based week tickformat that includes ' + tickformat, function(done) { + ['%V', '%W'].forEach(function(formatter, i) { + it('should respect Monday-based week tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ x: ['2020-02-01', '2020-04-01'] @@ -5357,7 +5357,7 @@ describe('Test axes', function() { width: 1000, xaxis: { ticklabelmode: 'period', - tickformat: '%b-' + tickformat + tickformat: '%b-' + formatter } } }) @@ -5383,7 +5383,7 @@ describe('Test axes', function() { }); }); - ['%U', '%V', '%W'].forEach(function(tickformat, i) { + ['%U', '%V', '%W'].forEach(function(formatter, i) { it('should move weekly labels by one day (i.e. to help center the labels) when *day of week* rangebreak is present', function(done) { Plotly.newPlot(gd, { data: [{ @@ -5426,7 +5426,7 @@ describe('Test axes', function() { xaxis: { rangebreaks: [{bounds: ['sat', 'mon']}], ticklabelmode: 'period', - tickformat: '%b-' + tickformat + tickformat: '%b-' + formatter } } }) @@ -5446,8 +5446,8 @@ describe('Test axes', function() { }); }); - ['%A', '%a', '%d', '%e', '%j', '%u', '%w', '%x'].forEach(function(tickformat, i) { - it('should respect daily tickformat that includes ' + tickformat, function(done) { + ['%A', '%a', '%d', '%e', '%j', '%u', '%w', '%x'].forEach(function(formatter, i) { + it('should respect daily tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ x: ['2020-01-01', '2020-01-08'] @@ -5456,7 +5456,7 @@ describe('Test axes', function() { width: 1000, xaxis: { ticklabelmode: 'period', - tickformat: '%b-' + tickformat + tickformat: '%b-' + formatter } } }) @@ -5487,8 +5487,8 @@ describe('Test axes', function() { }); }); - ['%f', '%L', '%Q', '%s', '%S', '%M', '%H', '%I', '%p', '%X'].forEach(function(tickformat, i) { - it('should respect daily tickformat that includes ' + tickformat, function(done) { + ['%f', '%L', '%Q', '%s', '%S', '%M', '%H', '%I', '%p', '%X'].forEach(function(formatter, i) { + it('should respect daily tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ x: ['2020-01-01', '2020-01-02'] @@ -5497,7 +5497,7 @@ describe('Test axes', function() { width: 1000, xaxis: { ticklabelmode: 'period', - tickformat: '%a-' + tickformat + tickformat: '%a-' + formatter } } }) From 7febd59dc8a4e1934de632e902e6494ea7bb6efc Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 20 Aug 2020 15:37:03 -0400 Subject: [PATCH 13/24] add tests for auto labels and rangebreaks --- test/jasmine/tests/axes_test.js | 224 ++++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index a16b8040cd9..7fc5b8834bd 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5530,6 +5530,230 @@ describe('Test axes', function() { .then(done); }); }); + + [ + { + range: ['2020-12-15', '2084-12-15'], + positions: ['2020-07-01 15:00', '2030-07-02 15:00', '2040-07-01 15:00', '2050-07-02 15:00', '2060-07-01 15:00', '2070-07-02 15:00', '2080-07-01 15:00'], + labels: ['', '2030', '2040', '2050', '2060', '2070', '2080'] + }, + { + range: ['2020-12-15', '2052-12-15'], + positions: ['2020-07-01 15:00', '2025-07-02 15:00', '2030-07-02 15:00', '2035-07-02 15:00', '2040-07-01 15:00', '2045-07-02 15:00', '2050-07-02 15:00'], + labels: ['', '2025', '2030', '2035', '2040', '2045', '2050'] + }, + { + range: ['2020-12-15', '2036-12-15'], + positions: ['2020-07-01 15:00', '2022-07-02 15:00', '2024-07-01 15:00', '2026-07-02 15:00', '2028-07-01 15:00', '2030-07-02 15:00', '2032-07-01 15:00', '2034-07-02 15:00', '2036-07-01 15:00'], + labels: ['', '2022', '2024', '2026', '2028', '2030', '2032', '2034', '2036'] + }, + { + range: ['2020-12-15', '2028-12-15'], + positions: ['2020-07-02', '2021-07-02 12:00', '2022-07-02 12:00', '2023-07-02 12:00', '2024-07-02', '2025-07-02 12:00', '2026-07-02 12:00', '2027-07-02 12:00', '2028-07-01 12:00'], + labels: ['', '2021', '2022', '2023', '2024', '2025', '2026', '2027', '2028'] + }, + { + range: ['2020-12-15', '2024-12-15'], + positions: ['2020-07-16 05:15', '2021-01-16 05:15', '2021-07-16 05:15', '2022-01-16 05:15', '2022-07-16 05:15', '2023-01-16 05:15', '2023-07-16 05:15', '2024-01-16 05:15', '2024-07-16 05:15'], + labels: ['', 'Jan 2021', 'Jul 2021', 'Jan 2022', 'Jul 2022', 'Jan 2023', 'Jul 2023', 'Jan 2024', 'Jul 2024'] + }, + { + range: ['2020-12-15', '2022-12-15'], + positions: ['2020-10-16 05:15', '2021-01-16 05:15', '2021-04-16 05:15', '2021-07-16 05:15', '2021-10-16 05:15', '2022-01-16 05:15', '2022-04-16 05:15', '2022-07-16 05:15', '2022-10-16 05:15'], + labels: ['', 'Jan 2021', 'Apr 2021', 'Jul 2021', 'Oct 2021', 'Jan 2022', 'Apr 2022', 'Jul 2022', 'Oct 2022'] + }, + { + range: ['2020-12-15', '2021-12-15'], + positions: ['2020-11-16 05:15', '2021-01-16 05:15', '2021-03-16 05:15', '2021-05-16 05:15', '2021-07-16 05:15', '2021-09-16 05:15', '2021-11-16 05:15'], + labels: ['', 'Jan 2021', 'Mar 2021', 'May 2021', 'Jul 2021', 'Sep 2021', 'Nov 2021'] + }, + { + range: ['2020-12-15', '2021-06-15'], + positions: ['2020-12-16 12:00', '2021-01-16 12:00', '2021-02-15', '2021-03-16 12:00', '2021-04-16', '2021-05-16 12:00', '2021-06-16 12:00'], + labels: ['Dec 2020', 'Jan 2021', 'Feb 2021', 'Mar 2021', 'Apr 2021', 'May 2021', ''] + }, + { + range: ['2020-12-15', '2021-02-15'], + positions: ['2020-12-13 12:00', '2020-12-20 12:00', '2020-12-27 12:00', '2021-01-03 12:00', '2021-01-10 12:00', '2021-01-17 12:00', '2021-01-24 12:00', '2021-01-31 12:00', '2021-02-07 12:00', '2021-02-14 12:00'], + labels: ['', 'Dec 20
2020', 'Dec 27', 'Jan 3
2021', 'Jan 10', 'Jan 17', 'Jan 24', 'Jan 31', 'Feb 7', 'Feb 14'] + }, + { + range: ['2020-12-15', '2021-01-15'], + positions: ['2020-12-13 12:00', '2020-12-20 12:00', '2020-12-27 12:00', '2021-01-03 12:00', '2021-01-10 12:00'], + labels: ['', 'Dec 20
2020', 'Dec 27', 'Jan 3
2021', 'Jan 10'] + }, + { + range: ['2020-12-15', '2021-01-01'], + positions: ['2020-12-14 12:00', '2020-12-16 12:00', '2020-12-18 12:00', '2020-12-20 12:00', '2020-12-22 12:00', '2020-12-24 12:00', '2020-12-26 12:00', '2020-12-28 12:00', '2020-12-30 12:00', '2021-01-01 12:00'], + labels: ['', 'Dec 16
2020', 'Dec 18', 'Dec 20', 'Dec 22', 'Dec 24', 'Dec 26', 'Dec 28', 'Dec 30', ''] + }, + { + range: ['2020-12-15', '2020-12-21'], + positions: ['2020-12-14 12:00', '2020-12-15 12:00', '2020-12-16 12:00', '2020-12-17 12:00', '2020-12-18 12:00', '2020-12-19 12:00', '2020-12-20 12:00', '2020-12-21 12:00'], + labels: ['', 'Dec 15
2020', 'Dec 16', 'Dec 17', 'Dec 18', 'Dec 19', 'Dec 20', ''] + }, + { + range: ['2020-12-15', '2020-12-16'], + positions: ['2020-12-14 21:00', '2020-12-15', '2020-12-15 03:00', '2020-12-15 06:00', '2020-12-15 09:00', '2020-12-15 12:00', '2020-12-15 15:00', '2020-12-15 18:00', '2020-12-15 21:00', '2020-12-16'], + labels: ['', '00:00
Dec 15, 2020', '03:00', '06:00', '09:00', '12:00', '15:00', '18:00', '21:00', '00:00
Dec 16, 2020'] + }, + { + range: ['2020-12-15', '2020-12-15 12:00'], + positions: ['2020-12-14 22:00', '2020-12-15', '2020-12-15 02:00', '2020-12-15 04:00', '2020-12-15 06:00', '2020-12-15 08:00', '2020-12-15 10:00', '2020-12-15 12:00'], + labels: ['', '00:00
Dec 15, 2020', '02:00', '04:00', '06:00', '08:00', '10:00', '12:00'] + } + ].forEach(function(t) { + it('should position auto labels | range:' + t.range, function(done) { + Plotly.newPlot(gd, { + data: [{ + x: [ + '2020-12-15', + '2020-12-15 0:45', + '2020-12-15 1:30', + '2020-12-15 3:00', + '2020-12-15 6:00', + '2020-12-15 12:00', + '2020-12-16', + '2020-12-18', + '2020-12-24', + '2021-01-01', + '2021-01-15', + '2021-02-15', + '2021-03-15', + '2021-04-15', + '2021-05-15', + '2021-06-15', + '2021-07-01', + '2022-07-01', + '2023-07-01', + '2024-07-01', + '2025-07-01', + '2030-07-01', + '2035-07-01', + '2040-07-01', + '2080-07-01', + '2160-07-01' + ] + }], + layout: { + width: 1000, + xaxis: { + ticklabelmode: 'period', + range: t.range + } + } + }) + .then(function() { + _assert('', t.positions, t.labels); + }) + .catch(failTest) + .then(done); + }); + }); + + [ + { + range: ['2020-12-14 08:00', '2022-12-14 08:00'], + positions: ['2020-12-06 10:26:47.1429', '2021-03-07 09:50:21.4286', '2021-06-06 16:26:47.1429', '2021-09-06 16:26:47.1429', '2021-12-07 09:50:21.4286', '2022-03-06 16:26:47.1429', '2022-06-06 16:26:47.1429', '2022-09-07 01:08:34.2857', '2022-12-07 01:08:34.2857'], + labels: ['', 'Mar 2021', 'Jun 2021', 'Sep 2021', 'Dec 2021', 'Mar 2022', 'Jun 2022', 'Sep 2022', 'Dec 2022'] + }, + { + range: ['2020-12-14 08:00', '2021-08-14 08:00'], + positions: ['2020-12-06 04:17:08.5714', '2020-12-27 22:00', '2021-01-24 22:00', '2021-02-21 22:00', '2021-03-21 22:00', '2021-04-18 22:00', '2021-05-16 22:00', '2021-06-13 22:00', '2021-07-11 22:00', '2021-08-08 22:00'], + labels: ['', 'Dec 21
2020', 'Jan 18
2021', 'Feb 15', 'Mar 15', 'Apr 12', 'May 10', 'Jun 7', 'Jul 5', 'Aug 2'] + }, + { + range: ['2020-12-14 08:00', '2021-04-14 08:00'], + positions: ['2020-12-13 03:42:51.4286', '2020-12-21 11:42:51.4286', '2021-01-04 11:42:51.4286', '2021-01-18 11:42:51.4286', '2021-02-01 11:42:51.4286', '2021-02-15 11:42:51.4286', '2021-03-01 11:42:51.4286', '2021-03-15 11:42:51.4286', '2021-03-29 11:42:51.4286', '2021-04-12 11:42:51.4286'], + labels: ['', 'Dec 21
2020', 'Jan 4
2021', 'Jan 18', 'Feb 1', 'Feb 15', 'Mar 1', 'Mar 15', 'Mar 29', 'Apr 12'] + }, + { + range: ['2020-12-14 08:00', '2021-02-14 08:00'], + positions: ['2020-12-13 03:42:51.4286', '2020-12-21 10:17:08.5714', '2020-12-28 10:17:08.5714', '2021-01-04 10:17:08.5714', '2021-01-11 10:17:08.5714', '2021-01-18 10:17:08.5714', '2021-01-25 10:17:08.5714', '2021-02-01 10:17:08.5714', '2021-02-08 11:42:51.4286', '2021-02-14 13:42:51.4286'], + labels: ['', 'Dec 21
2020', 'Dec 28', 'Jan 4
2021', 'Jan 11', 'Jan 18', 'Jan 25', 'Feb 1', 'Feb 8', ''] + }, + { + range: ['2020-12-14 08:00', '2021-01-14 08:00'], + positions: ['2020-12-14 05:08:34.2857', '2020-12-16 12:17:08.5714', '2020-12-18 09:08:34.2857', '2020-12-22 12:17:08.5714', '2020-12-24 09:08:34.2857', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 09:08:34.2857', '2021-01-05 12:17:08.5714', '2021-01-07 09:08:34.2857', '2021-01-11 12:17:08.5714', '2021-01-13 12:17:08.5714'], + labels: ['', 'Dec 16
2020', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', 'Jan 1
2021', 'Jan 5', 'Jan 7', 'Jan 11', 'Jan 13'] + }, + { + range: ['2020-12-14 08:00', '2021-01-01 08:00'], + positions: ['2020-12-14 05:08:34.2857', '2020-12-16 12:17:08.5714', '2020-12-18 09:08:34.2857', '2020-12-22 12:17:08.5714', '2020-12-24 09:08:34.2857', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 12:17:08.5714'], + labels: ['', 'Dec 16
2020', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', ''] + }, + { + range: ['2020-12-14 08:00', '2020-12-22 08:00'], + positions: ['2020-12-14 04:51:25.7143', '2020-12-15 12:00', '2020-12-16 12:00', '2020-12-17 12:00', '2020-12-18 08:00', '2020-12-21 12:00', '2020-12-22 12:00'], + labels: ['', '06:00
Dec 15, 2020', '06:00
Dec 16, 2020', '06:00
Dec 17, 2020', '06:00
Dec 18, 2020', '06:00
Dec 21, 2020', ''] + }, + { + range: ['2020-12-14 08:00', '2020-12-18 08:00'], + positions: ['2020-12-14 06:00', '2020-12-14 12:00', '2020-12-15 06:00', '2020-12-15 12:00', '2020-12-16 06:00', '2020-12-16 12:00', '2020-12-17 06:00', '2020-12-17 12:00', '2020-12-18 06:00'], + labels: ['', '12:00
Dec 14, 2020', '06:00
Dec 15, 2020', '12:00', '06:00
Dec 16, 2020', '12:00', '06:00
Dec 17, 2020', '12:00', '06:00
Dec 18, 2020'] + }, + { + range: ['2020-12-14 08:00', '2020-12-16 08:00'], + positions: ['2020-12-14 06:00', '2020-12-14 09:00', '2020-12-14 12:00', '2020-12-14 15:00', '2020-12-15 06:00', '2020-12-15 09:00', '2020-12-15 12:00', '2020-12-15 15:00', '2020-12-16 06:00'], + labels: ['', '09:00
Dec 14, 2020', '12:00', '15:00', '06:00
Dec 15, 2020', '09:00', '12:00', '15:00', '06:00
Dec 16, 2020'] + } + ].forEach(function(t) { + it('should position auto labels with rangebreaks | range:' + t.range, function(done) { + Plotly.newPlot(gd, { + data: [{ + x: [ + '2020-12-14 08:00', '2020-12-14 12:00', '2020-12-14 16:00', + '2020-12-15 08:00', '2020-12-15 12:00', '2020-12-15 16:00', + '2020-12-16 08:00', '2020-12-16 12:00', '2020-12-16 16:00', + '2020-12-17 08:00', '2020-12-17 12:00', '2020-12-17 16:00', + '2020-12-18 08:00', '2020-12-18 12:00', '2020-12-18 16:00', + + '2020-12-21 08:00', '2020-12-21 12:00', '2020-12-21 16:00', + '2020-12-22 08:00', '2020-12-22 12:00', '2020-12-22 16:00', + '2020-12-23 08:00', '2020-12-23 12:00', '2020-12-23 16:00', + '2020-12-24 08:00', '2020-12-24 12:00', '2020-12-24 16:00', + '2020-12-25 08:00', '2020-12-25 12:00', '2020-12-25 16:00', + + '2020-12-28 08:00', '2020-12-28 12:00', '2020-12-28 16:00', + '2020-12-29 08:00', '2020-12-29 12:00', '2020-12-29 16:00', + '2020-12-30 08:00', '2020-12-30 12:00', '2020-12-30 16:00', + '2020-12-31 08:00', '2020-12-31 12:00', '2020-12-31 16:00', + '2021-01-01 08:00', '2021-01-01 12:00', '2021-01-01 16:00', + + '2021-01-04 08:00', '2021-01-04 12:00', '2021-01-04 16:00', + '2021-01-05 08:00', '2021-01-05 12:00', '2021-01-05 16:00', + '2021-01-06 08:00', '2021-01-06 12:00', '2021-01-06 16:00', + '2021-01-07 08:00', '2021-01-07 12:00', '2021-01-07 16:00', + '2021-01-08 08:00', '2021-01-08 12:00', '2021-01-08 16:00', + + '2021-01-11 08:00', '2021-01-11 12:00', '2021-01-11 16:00', + '2021-01-12 08:00', '2021-01-12 12:00', '2021-01-12 16:00', + '2021-01-13 08:00', '2021-01-13 12:00', '2021-01-13 16:00', + '2021-01-14 08:00', '2021-01-14 12:00', '2021-01-14 16:00', + '2021-01-15 08:00', '2021-01-15 12:00', '2021-01-15 16:00', + ] + }], + layout: { + width: 1000, + xaxis: { + rangebreaks: [{ + bounds: ['sat', 'mon'] + }, { + bounds: [18, 6], + pattern: 'hour' + }], + ticklabelmode: 'period', + range: t.range + } + } + }) + .then(function() { + _assert('', t.positions, t.labels); + }) + .catch(failTest) + .then(done); + }); + }); }); }); From 636531b0f1f13dfa9c4be384d727d18bad53ce5f Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 20 Aug 2020 16:43:37 -0400 Subject: [PATCH 14/24] add hovertemplate to make debugging easier in future --- test/jasmine/tests/axes_test.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 7fc5b8834bd..6f2c4c57055 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5198,6 +5198,7 @@ describe('Test axes', function() { }); describe('label positioning using *ticklabelmode*: "period"', function() { + var hovertemplate = 'x:%{x|%x %X}'; // to make debugging easier var gd; beforeEach(function() { @@ -5220,6 +5221,7 @@ describe('Test axes', function() { it('should respect yearly tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ + hovertemplate: hovertemplate, x: ['2020-01-01', '2026-01-01'] }], layout: { @@ -5253,6 +5255,7 @@ describe('Test axes', function() { it('should respect quarters tickformat that includes %q', function(done) { Plotly.newPlot(gd, { data: [{ + hovertemplate: hovertemplate, x: ['2020-01-01', '2022-01-01'] }], layout: { @@ -5285,6 +5288,7 @@ describe('Test axes', function() { it('should respect monthly tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ + hovertemplate: hovertemplate, x: ['2020-01-01', '2020-07-01'] }], layout: { @@ -5319,6 +5323,7 @@ describe('Test axes', function() { it('should respect Sunday-based week tickformat that includes %U', function(done) { Plotly.newPlot(gd, { data: [{ + hovertemplate: hovertemplate, x: ['2020-02-01', '2020-04-01'] }], layout: { @@ -5351,6 +5356,7 @@ describe('Test axes', function() { it('should respect Monday-based week tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ + hovertemplate: hovertemplate, x: ['2020-02-01', '2020-04-01'] }], layout: { @@ -5387,6 +5393,7 @@ describe('Test axes', function() { it('should move weekly labels by one day (i.e. to help center the labels) when *day of week* rangebreak is present', function(done) { Plotly.newPlot(gd, { data: [{ + hovertemplate: hovertemplate, x: [ '2020-01-01', '2020-01-02', @@ -5450,6 +5457,7 @@ describe('Test axes', function() { it('should respect daily tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ + hovertemplate: hovertemplate, x: ['2020-01-01', '2020-01-08'] }], layout: { @@ -5491,6 +5499,7 @@ describe('Test axes', function() { it('should respect daily tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ + hovertemplate: hovertemplate, x: ['2020-01-01', '2020-01-02'] }], layout: { @@ -5606,6 +5615,7 @@ describe('Test axes', function() { it('should position auto labels | range:' + t.range, function(done) { Plotly.newPlot(gd, { data: [{ + hovertemplate: hovertemplate, x: [ '2020-12-15', '2020-12-15 0:45', @@ -5701,6 +5711,7 @@ describe('Test axes', function() { it('should position auto labels with rangebreaks | range:' + t.range, function(done) { Plotly.newPlot(gd, { data: [{ + hovertemplate: hovertemplate, x: [ '2020-12-14 08:00', '2020-12-14 12:00', '2020-12-14 16:00', '2020-12-15 08:00', '2020-12-15 12:00', '2020-12-15 16:00', From dddcaa80b68d392f8be94c92484470e03339f972 Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 20 Aug 2020 16:57:05 -0400 Subject: [PATCH 15/24] make week and quarter labels mode readable in tests --- test/jasmine/tests/axes_test.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 6f2c4c57055..99ae46c6e5b 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5262,7 +5262,7 @@ describe('Test axes', function() { width: 1000, xaxis: { ticklabelmode: 'period', - tickformat: '%Y-%q' + tickformat: '%Y-Q%q' } } }) @@ -5278,7 +5278,7 @@ describe('Test axes', function() { '2021-08-16', '2021-11-16', '2022-02-16' - ], ['', '2020-1', '2020-2', '2020-3', '2020-4', '2021-1', '2021-2', '2021-3', '2021-4', '']); + ], ['', '2020-Q1', '2020-Q2', '2020-Q3', '2020-Q4', '2021-Q1', '2021-Q2', '2021-Q3', '2021-Q4', '']); }) .catch(failTest) .then(done); @@ -5295,7 +5295,7 @@ describe('Test axes', function() { width: 1000, xaxis: { ticklabelmode: 'period', - tickformat: '%q-' + formatter + tickformat: 'Q%q-' + formatter } } }) @@ -5310,9 +5310,9 @@ describe('Test axes', function() { '2020-06-16', '2020-07-16' ], [ - ['', '1-January', '1-February', '1-March', '2-April', '2-May', '2-June', ''], - ['', '1-Jan', '1-Feb', '1-Mar', '2-Apr', '2-May', '2-Jun', ''], - ['', '1-01', '1-02', '1-03', '2-04', '2-05', '2-06', ''] + ['', 'Q1-January', 'Q1-February', 'Q1-March', 'Q2-April', 'Q2-May', 'Q2-June', ''], + ['', 'Q1-Jan', 'Q1-Feb', 'Q1-Mar', 'Q2-Apr', 'Q2-May', 'Q2-Jun', ''], + ['', 'Q1-01', 'Q1-02', 'Q1-03', 'Q2-04', 'Q2-05', 'Q2-06', ''] ][i]); }) .catch(failTest) @@ -5330,7 +5330,7 @@ describe('Test axes', function() { width: 1000, xaxis: { ticklabelmode: 'period', - tickformat: '%b-%U' + tickformat: '%b-W%U' } } }) @@ -5346,7 +5346,7 @@ describe('Test axes', function() { '2020-03-18 12:00', '2020-03-25 12:00', '2020-04-01 12:00' - ], ['Jan-04', 'Feb-05', 'Feb-06', 'Feb-07', 'Feb-08', 'Mar-09', 'Mar-10', 'Mar-11', 'Mar-12', 'Mar-13']); + ], ['Jan-W04', 'Feb-W05', 'Feb-W06', 'Feb-W07', 'Feb-W08', 'Mar-W09', 'Mar-W10', 'Mar-W11', 'Mar-W12', 'Mar-W13']); }) .catch(failTest) .then(done); @@ -5363,7 +5363,7 @@ describe('Test axes', function() { width: 1000, xaxis: { ticklabelmode: 'period', - tickformat: '%b-' + formatter + tickformat: '%b-W' + formatter } } }) @@ -5380,8 +5380,8 @@ describe('Test axes', function() { '2020-03-26 12:00', '2020-04-02 12:00' ], [ - ['Jan-05', 'Feb-06', 'Feb-07', 'Feb-08', 'Feb-09', 'Mar-10', 'Mar-11', 'Mar-12', 'Mar-13', 'Mar-14'], - ['Jan-04', 'Feb-05', 'Feb-06', 'Feb-07', 'Feb-08', 'Mar-09', 'Mar-10', 'Mar-11', 'Mar-12', 'Mar-13'] + ['Jan-W05', 'Feb-W06', 'Feb-W07', 'Feb-W08', 'Feb-W09', 'Mar-W10', 'Mar-W11', 'Mar-W12', 'Mar-W13', 'Mar-W14'], + ['Jan-W04', 'Feb-W05', 'Feb-W06', 'Feb-W07', 'Feb-W08', 'Mar-W09', 'Mar-W10', 'Mar-W11', 'Mar-W12', 'Mar-W13'] ][i]); }) .catch(failTest) @@ -5433,7 +5433,7 @@ describe('Test axes', function() { xaxis: { rangebreaks: [{bounds: ['sat', 'mon']}], ticklabelmode: 'period', - tickformat: '%b-' + formatter + tickformat: '%b-W' + formatter } } }) @@ -5443,9 +5443,9 @@ describe('Test axes', function() { ['2020-01-01 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'], ['2020-01-01 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'] ][i], [ - ['', 'Jan-01', 'Jan-02', 'Jan-03', 'Jan-04'], - ['Dec-01', 'Jan-02', 'Jan-03', 'Jan-04', 'Jan-05'], - ['Dec-52', 'Jan-01', 'Jan-02', 'Jan-03', 'Jan-04'] + ['', 'Jan-W01', 'Jan-W02', 'Jan-W03', 'Jan-W04'], + ['Dec-W01', 'Jan-W02', 'Jan-W03', 'Jan-W04', 'Jan-W05'], + ['Dec-W52', 'Jan-W01', 'Jan-W02', 'Jan-W03', 'Jan-W04'] ][i]); }) .catch(failTest) From b32b5a4fba2958337b77f35497a672a7601f7fd0 Mon Sep 17 00:00:00 2001 From: archmoj Date: Thu, 20 Aug 2020 18:30:03 -0400 Subject: [PATCH 16/24] add tests for period labels on axes with reversed ranges --- test/jasmine/tests/axes_test.js | 121 ++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 99ae46c6e5b..06891effe67 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5661,6 +5661,127 @@ describe('Test axes', function() { }); }); + [ + { + range: ['2084-12-15', '2020-12-15'], + positions: ['2090-07-02 15:00', '2080-07-01 15:00', '2070-07-02 15:00', '2060-07-01 15:00', '2050-07-02 15:00', '2040-07-01 15:00', '2030-07-02 15:00'], + labels: ['', '2080', '2070', '2060', '2050', '2040', '2030'] + }, + { + range: ['2052-12-15', '2020-12-15'], + positions: ['2055-07-02 15:00', '2050-07-02 15:00', '2045-07-02 15:00', '2040-07-01 15:00', '2035-07-02 15:00', '2030-07-02 15:00', '2025-07-02 15:00'], + labels: ['', '2050', '2045', '2040', '2035', '2030', '2025'] + }, + { + range: ['2036-12-15', '2020-12-15'], + positions: ['2038-07-02 15:00', '2036-07-01 15:00', '2034-07-02 15:00', '2032-07-01 15:00', '2030-07-02 15:00', '2028-07-01 15:00', '2026-07-02 15:00', '2024-07-01 15:00', '2022-07-02 15:00'], + labels: ['', '2036', '2034', '2032', '2030', '2028', '2026', '2024', '2022'] + }, + { + range: ['2028-12-15', '2020-12-15'], + positions: ['2029-07-03', '2028-07-01 12:00', '2027-07-02 12:00', '2026-07-02 12:00', '2025-07-03', '2024-07-01 12:00', '2023-07-02 12:00', '2022-07-02 12:00', '2021-07-02 12:00'], + labels: ['', '2028', '2027', '2026', '2025', '2024', '2023', '2022', '2021'] + }, + { + range: ['2024-12-15', '2020-12-15'], + positions: ['2025-01-16 05:15', '2024-07-16 05:15', '2024-01-16 05:15', '2023-07-16 05:15', '2023-01-16 05:15', '2022-07-16 05:15', '2022-01-16 05:15', '2021-07-16 05:15', '2021-01-16 05:15'], + labels: ['', 'Jul 2024', 'Jan 2024', 'Jul 2023', 'Jan 2023', 'Jul 2022', 'Jan 2022', 'Jul 2021', 'Jan 2021'] + }, + { + range: ['2022-12-15', '2020-12-15'], + positions: ['2023-01-16 05:15', '2022-10-16 05:15', '2022-07-16 05:15', '2022-04-16 05:15', '2022-01-16 05:15', '2021-10-16 05:15', '2021-07-16 05:15', '2021-04-16 05:15', '2021-01-16 05:15'], + labels: ['', 'Oct 2022', 'Jul 2022', 'Apr 2022', 'Jan 2022', 'Oct 2021', 'Jul 2021', 'Apr 2021', 'Jan 2021'] + }, + { + range: ['2021-12-15', '2020-12-15'], + positions: ['2022-01-16 05:15', '2021-11-16 05:15', '2021-09-16 05:15', '2021-07-16 05:15', '2021-05-16 05:15', '2021-03-16 05:15', '2021-01-16 05:15'], + labels: ['', 'Nov 2021', 'Sep 2021', 'Jul 2021', 'May 2021', 'Mar 2021', 'Jan 2021'] + }, + { + range: ['2021-06-15', '2020-12-15'], + positions: ['2021-07-16', '2021-06-16 12:00', '2021-05-16', '2021-04-16 12:00', '2021-03-15', '2021-02-16 12:00', '2021-01-16 12:00'], + labels: ['', '', 'May 2021', 'Apr 2021', 'Mar 2021', 'Feb 2021', 'Jan 2021'] + }, + { + range: ['2021-02-15', '2020-12-15'], + positions: ['2021-02-21 12:00', '2021-02-14 12:00', '2021-02-07 12:00', '2021-01-31 12:00', '2021-01-24 12:00', '2021-01-17 12:00', '2021-01-10 12:00', '2021-01-03 12:00', '2020-12-27 12:00', '2020-12-20 12:00'], + labels: ['', 'Feb 14
2021', 'Feb 7', 'Jan 31', 'Jan 24', 'Jan 17', 'Jan 10', 'Jan 3', 'Dec 27
2020', 'Dec 20'] + }, + { + range: ['2021-01-15', '2020-12-15'], + positions: ['2021-01-17 12:00', '2021-01-10 12:00', '2021-01-03 12:00', '2020-12-27 12:00', '2020-12-20 12:00'], + labels: ['', 'Jan 10
2021', 'Jan 3', 'Dec 27
2020', 'Dec 20'] + }, + { + range: ['2021-01-01', '2020-12-15'], + positions: ['2021-01-03 12:00', '2021-01-01 12:00', '2020-12-30 12:00', '2020-12-28 12:00', '2020-12-26 12:00', '2020-12-24 12:00', '2020-12-22 12:00', '2020-12-20 12:00', '2020-12-18 12:00', '2020-12-16 12:00'], + labels: ['', '', 'Dec 30
2020', 'Dec 28', 'Dec 26', 'Dec 24', 'Dec 22', 'Dec 20', 'Dec 18', 'Dec 16'] + }, + { + range: ['2020-12-21', '2020-12-15'], + positions: ['2020-12-22 12:00', '2020-12-21 12:00', '2020-12-20 12:00', '2020-12-19 12:00', '2020-12-18 12:00', '2020-12-17 12:00', '2020-12-16 12:00', '2020-12-15 12:00'], + labels: ['', '', 'Dec 20
2020', 'Dec 19', 'Dec 18', 'Dec 17', 'Dec 16', 'Dec 15'] + }, + { + range: ['2020-12-16', '2020-12-15'], + positions: ['2020-12-16 03:00', '2020-12-16', '2020-12-15 21:00', '2020-12-15 18:00', '2020-12-15 15:00', '2020-12-15 12:00', '2020-12-15 09:00', '2020-12-15 06:00', '2020-12-15 03:00', '2020-12-15'], + labels: ['', '00:00
Dec 16, 2020', '21:00
Dec 15, 2020', '18:00', '15:00', '12:00', '09:00', '06:00', '03:00', '00:00'] + }, + { + range: ['2020-12-15 12:00', '2020-12-15'], + positions: ['2020-12-15 14:00', '2020-12-15 12:00', '2020-12-15 10:00', '2020-12-15 08:00', '2020-12-15 06:00', '2020-12-15 04:00', '2020-12-15 02:00', '2020-12-15'], + labels: ['', '12:00
Dec 15, 2020', '10:00', '08:00', '06:00', '04:00', '02:00', '00:00'] + } + ].forEach(function(t) { + it('should position auto labels | reversed range:' + t.range, function(done) { + Plotly.newPlot(gd, { + data: [{ + hovertemplate: hovertemplate, + x: [ + '2020-12-15', + '2020-12-15 0:45', + '2020-12-15 1:30', + '2020-12-15 3:00', + '2020-12-15 6:00', + '2020-12-15 12:00', + '2020-12-16', + '2020-12-18', + '2020-12-24', + '2021-01-01', + '2021-01-15', + '2021-02-15', + '2021-03-15', + '2021-04-15', + '2021-05-15', + '2021-06-15', + '2021-07-01', + '2022-07-01', + '2023-07-01', + '2024-07-01', + '2025-07-01', + '2030-07-01', + '2035-07-01', + '2040-07-01', + '2080-07-01', + '2160-07-01' + ] + }], + layout: { + width: 1000, + xaxis: { + ticklabelmode: 'period', + range: t.range + } + } + }) + .then(function() { + _assert('', t.positions, t.labels); + }) + .catch(failTest) + .then(done); + }); + }); + [ { range: ['2020-12-14 08:00', '2022-12-14 08:00'], From 350a10acce19a14084af9c5d3af2979916ffab37 Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 31 Aug 2020 09:07:32 -0400 Subject: [PATCH 17/24] position quarters in period mode - case of dtick set to M6 --- src/plots/cartesian/axes.js | 2 ++ test/jasmine/tests/axes_test.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 57c67304907..4400f643d0f 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -794,6 +794,8 @@ axes.calcTicks = function calcTicks(ax, opts) { } else if(definedDelta === ONEAVGQUARTER && delta >= ONEMINQUARTER) { if(actualDelta >= ONEMINQUARTER && actualDelta <= ONEMAXQUARTER) { periodLength = actualDelta; + } else { + periodLength = ONEAVGQUARTER; } } else if(delta >= ONEMINMONTH) { if(actualDelta >= ONEMINMONTH && actualDelta <= ONEMAXMONTH) { diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 06891effe67..e611f816097 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5284,6 +5284,35 @@ describe('Test axes', function() { .then(done); }); + it('should position quarters - case of dtick set to M6', function(done) { + Plotly.newPlot(gd, { + data: [{ + hovertemplate: hovertemplate, + x: ['2020-01-01', '2022-01-01'] + }], + layout: { + width: 1000, + xaxis: { + dtick: 'M6', + ticklabelmode: 'period', + tickformat: '%Y-Q%q' + } + } + }) + .then(function() { + _assert('', [ + '2019-08-15 15:45', + '2020-02-15 15:45', + '2020-08-15 15:45', + '2021-02-15 15:45', + '2021-08-15 15:45', + '2022-02-15 15:45' + ], ['', '2020-Q1', '2020-Q3', '2021-Q1', '2021-Q3', '']); + }) + .catch(failTest) + .then(done); + }); + ['%B', '%b', '%m'].forEach(function(formatter, i) { it('should respect monthly tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { From 50a34519913d39339e15a70edbe566d5b73a1bdd Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 31 Aug 2020 10:38:59 -0400 Subject: [PATCH 18/24] skip labels with identical text as previous label --- src/plots/cartesian/axes.js | 46 ++++++++++++++++---------- test/jasmine/tests/axes_test.js | 57 +++++++++++++++++++++++++++++---- 2 files changed, 80 insertions(+), 23 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 4400f643d0f..99ab3b5354a 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -752,35 +752,47 @@ axes.calcTicks = function calcTicks(ax, opts) { } } - var removedPreTick0Label = false; - var ticksOut = new Array(tickVals.length); + var ticksOut = []; var i; + var prevText; for(i = 0; i < tickVals.length; i++) { var _minor = tickVals[i].minor; var _value = tickVals[i].value; - ticksOut[i] = axes.tickText( + var t = axes.tickText( ax, _value, false, // hover _minor // noSuffixPrefix ); - if(isPeriod) { - var v = tickVals[i].value; + if(isPeriod && prevText === t.text) continue; + prevText = t.text; + + ticksOut.push(t); + } + + if(isPeriod) { + var removedPreTick0Label = false; + + for(i = 0; i < ticksOut.length; i++) { + var v = ticksOut[i].x; var a = i; var b = i + 1; - if(i < tickVals.length - 1) { + if(i < ticksOut.length - 1) { a = i; b = i + 1; - } else { + } else if(i > 0) { a = i - 1; b = i; + } else { + a = i; + b = i; } - var A = tickVals[a].value; - var B = tickVals[b].value; + var A = ticksOut[a].x; + var B = ticksOut[b].x; var actualDelta = Math.abs(B - A); var delta = definedDelta || actualDelta; var periodLength = 0; @@ -828,15 +840,15 @@ axes.calcTicks = function calcTicks(ax, opts) { removedPreTick0Label = true; } } - } - if(removedPreTick0Label) { - for(i = 0; i < ticksOut.length; i++) { - if(ticksOut[i].periodX <= maxRange && ticksOut[i].periodX >= minRange) { - // redo first visible tick - ax._prevDateHead = ''; - ticksOut[i].text = axes.tickText(ax, tickVals[i].value).text; - break; + if(removedPreTick0Label) { + for(i = 0; i < ticksOut.length; i++) { + if(ticksOut[i].periodX <= maxRange && ticksOut[i].periodX >= minRange) { + // redo first visible tick + ax._prevDateHead = ''; + ticksOut[i].text = axes.tickText(ax, ticksOut[i].x).text; + break; + } } } } diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index e611f816097..b027f5030f1 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5524,7 +5524,7 @@ describe('Test axes', function() { }); }); - ['%f', '%L', '%Q', '%s', '%S', '%M', '%H', '%I', '%p', '%X'].forEach(function(formatter, i) { + ['%Q', '%s', '%H', '%I', '%X'].forEach(function(formatter, i) { it('should respect daily tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ @@ -5552,15 +5552,10 @@ describe('Test axes', function() { '2020-01-01 21:00', '2020-01-02' ], [ - ['', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Thu-0'], - ['', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Thu-000'], ['', 'Wed-1577836800000', 'Wed-1577847600000', 'Wed-1577858400000', 'Wed-1577869200000', 'Wed-1577880000000', 'Wed-1577890800000', 'Wed-1577901600000', 'Wed-1577912400000', 'Thu-1577923200000'], ['', 'Wed-1577836800', 'Wed-1577847600', 'Wed-1577858400', 'Wed-1577869200', 'Wed-1577880000', 'Wed-1577890800', 'Wed-1577901600', 'Wed-1577912400', 'Thu-1577923200'], - ['', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Thu-00'], - ['', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Thu-00'], ['', 'Wed-00', 'Wed-03', 'Wed-06', 'Wed-09', 'Wed-12', 'Wed-15', 'Wed-18', 'Wed-21', 'Thu-00'], ['', 'Wed-12', 'Wed-03', 'Wed-06', 'Wed-09', 'Wed-12', 'Wed-03', 'Wed-06', 'Wed-09', 'Thu-12'], - ['', 'Wed-AM', 'Wed-AM', 'Wed-AM', 'Wed-AM', 'Wed-PM', 'Wed-PM', 'Wed-PM', 'Wed-PM', 'Thu-AM'], ['', 'Wed-00:00:00', 'Wed-03:00:00', 'Wed-06:00:00', 'Wed-09:00:00', 'Wed-12:00:00', 'Wed-15:00:00', 'Wed-18:00:00', 'Wed-21:00:00', 'Thu-00:00:00'] ][i]); }) @@ -5569,6 +5564,56 @@ describe('Test axes', function() { }); }); + + [ + { + formatter: '%p', + positions: ['2019-12-31 21:00', '2020-01-01', '2020-01-01 12:00', '2020-01-02'], + labels: ['', 'Wed-AM', 'Wed-PM', 'Thu-AM'] + }, + { + formatter: '%M', + positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'], + labels: ['', 'Wed-00', ''] + }, + { + formatter: '%S', + positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'], + labels: ['', 'Wed-00', ''] + }, + { + formatter: '%L', + positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'], + labels: ['', 'Wed-000', ''] + }, + { + formatter: '%f', + positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'], + labels: ['', 'Wed-0', ''] + } + ].forEach(function(t) { + it('should respect time tickformat that includes ' + t.formatter, function(done) { + Plotly.newPlot(gd, { + data: [{ + hovertemplate: hovertemplate, + x: ['2020-01-01', '2020-01-02'] + }], + layout: { + width: 1000, + xaxis: { + ticklabelmode: 'period', + tickformat: '%a-' + t.formatter + } + } + }) + .then(function() { + _assert('', t.positions, t.labels); + }) + .catch(failTest) + .then(done); + }); + }); + [ { range: ['2020-12-15', '2084-12-15'], From 2920e31790b0ad7b02d50f2d9c7b72949bb5b08e Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 31 Aug 2020 15:26:10 -0400 Subject: [PATCH 19/24] ensure new label positions remains between ticks --- src/plots/cartesian/axes.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 99ab3b5354a..73233ccf3a0 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -831,7 +831,9 @@ axes.calcTicks = function calcTicks(ax, opts) { periodLength *= 1 - nOut / nAll; } - v += periodLength / 2; + if(periodLength <= actualDelta) { // i.e. to ensure new label positions remain between ticks + v += periodLength / 2; + } ticksOut[i].periodX = v; From 12ce0665525f60e8731079ff856a501e1ac15b2d Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 31 Aug 2020 16:49:33 -0400 Subject: [PATCH 20/24] adjust AM/PM period case --- src/plots/cartesian/axes.js | 11 ++++++++--- test/jasmine/tests/axes_test.js | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 73233ccf3a0..b077174e7fa 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -34,6 +34,7 @@ var ONEAVGMONTH = constants.ONEAVGMONTH; var ONEMINMONTH = constants.ONEMINMONTH; var ONEWEEK = constants.ONEWEEK; var ONEDAY = constants.ONEDAY; +var HALFDAY = ONEDAY / 2; var ONEHOUR = constants.ONEHOUR; var ONEMIN = constants.ONEMIN; var ONESEC = constants.ONESEC; @@ -503,7 +504,7 @@ function autoShiftMonthBins(binStart, data, dtick, dataMin, calendar) { // will always give a somewhat odd-looking label, until we do something // smarter like showing the bin boundaries (or the bounds of the actual // data in each bin) - binStart -= ONEDAY / 2; + binStart -= HALFDAY; } var nextBinStart = axes.tickIncrement(binStart, dtick); @@ -705,7 +706,7 @@ axes.calcTicks = function calcTicks(ax, opts) { var tickformat = axes.getTickFormat(ax); if(isPeriod && tickformat) { if( - !(/%[fLQsSMHIpX]/.test(tickformat)) + !(/%[fLQsSMHIX]/.test(tickformat)) // %f: microseconds as a decimal number [000000, 999999] // %L: milliseconds as a decimal number [000, 999] // %Q: milliseconds since UNIX epoch @@ -714,10 +715,12 @@ axes.calcTicks = function calcTicks(ax, opts) { // %M: minute as a decimal number [00,59] // %H: hour (24-hour clock) as a decimal number [00,23] // %I: hour (12-hour clock) as a decimal number [01,12] - // %p: either AM or PM // %X: the locale’s time, such as %-I:%M:%S %p ) { if( + /%p/.test(tickformat) // %p: either AM or PM + ) definedDelta = HALFDAY; + else if( /%[Aadejuwx]/.test(tickformat) // %A: full weekday name // %a: abbreviated weekday name @@ -819,6 +822,8 @@ axes.calcTicks = function calcTicks(ax, opts) { periodLength = ONEWEEK; } else if(delta >= ONEDAY) { periodLength = ONEDAY; + } else if(definedDelta === HALFDAY && delta >= HALFDAY) { + periodLength = HALFDAY; } if(periodLength && ax.rangebreaks) { diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index b027f5030f1..baf29c16e05 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5568,8 +5568,8 @@ describe('Test axes', function() { [ { formatter: '%p', - positions: ['2019-12-31 21:00', '2020-01-01', '2020-01-01 12:00', '2020-01-02'], - labels: ['', 'Wed-AM', 'Wed-PM', 'Thu-AM'] + positions: ['2019-12-31 21:00', '2020-01-01 06:00', '2020-01-01 18:00', '2020-01-02 06:00'], + labels: ['', 'Wed-AM', 'Wed-PM', ''] }, { formatter: '%M', From f47c8206b7f36b1f6faed0d8437335447479faf3 Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 31 Aug 2020 17:13:23 -0400 Subject: [PATCH 21/24] adjust hour period case --- src/plots/cartesian/axes.js | 11 ++++++++--- test/jasmine/tests/axes_test.js | 14 +++++++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index b077174e7fa..0ddec230136 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -706,18 +706,21 @@ axes.calcTicks = function calcTicks(ax, opts) { var tickformat = axes.getTickFormat(ax); if(isPeriod && tickformat) { if( - !(/%[fLQsSMHIX]/.test(tickformat)) + !(/%[fLQsSMX]/.test(tickformat)) // %f: microseconds as a decimal number [000000, 999999] // %L: milliseconds as a decimal number [000, 999] // %Q: milliseconds since UNIX epoch // %s: seconds since UNIX epoch // %S: second as a decimal number [00,61] // %M: minute as a decimal number [00,59] - // %H: hour (24-hour clock) as a decimal number [00,23] - // %I: hour (12-hour clock) as a decimal number [01,12] // %X: the locale’s time, such as %-I:%M:%S %p ) { if( + /%[HI]/.test(tickformat) + // %H: hour (24-hour clock) as a decimal number [00,23] + // %I: hour (12-hour clock) as a decimal number [01,12] + ) definedDelta = ONEHOUR; + else if( /%p/.test(tickformat) // %p: either AM or PM ) definedDelta = HALFDAY; else if( @@ -824,6 +827,8 @@ axes.calcTicks = function calcTicks(ax, opts) { periodLength = ONEDAY; } else if(definedDelta === HALFDAY && delta >= HALFDAY) { periodLength = HALFDAY; + } else if(definedDelta === ONEHOUR && delta >= ONEHOUR) { + periodLength = ONEHOUR; } if(periodLength && ax.rangebreaks) { diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index baf29c16e05..2af30f6fabe 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5524,7 +5524,7 @@ describe('Test axes', function() { }); }); - ['%Q', '%s', '%H', '%I', '%X'].forEach(function(formatter, i) { + ['%Q', '%s', '%X'].forEach(function(formatter, i) { it('should respect daily tickformat that includes ' + formatter, function(done) { Plotly.newPlot(gd, { data: [{ @@ -5554,8 +5554,6 @@ describe('Test axes', function() { ], [ ['', 'Wed-1577836800000', 'Wed-1577847600000', 'Wed-1577858400000', 'Wed-1577869200000', 'Wed-1577880000000', 'Wed-1577890800000', 'Wed-1577901600000', 'Wed-1577912400000', 'Thu-1577923200000'], ['', 'Wed-1577836800', 'Wed-1577847600', 'Wed-1577858400', 'Wed-1577869200', 'Wed-1577880000', 'Wed-1577890800', 'Wed-1577901600', 'Wed-1577912400', 'Thu-1577923200'], - ['', 'Wed-00', 'Wed-03', 'Wed-06', 'Wed-09', 'Wed-12', 'Wed-15', 'Wed-18', 'Wed-21', 'Thu-00'], - ['', 'Wed-12', 'Wed-03', 'Wed-06', 'Wed-09', 'Wed-12', 'Wed-03', 'Wed-06', 'Wed-09', 'Thu-12'], ['', 'Wed-00:00:00', 'Wed-03:00:00', 'Wed-06:00:00', 'Wed-09:00:00', 'Wed-12:00:00', 'Wed-15:00:00', 'Wed-18:00:00', 'Wed-21:00:00', 'Thu-00:00:00'] ][i]); }) @@ -5566,6 +5564,16 @@ describe('Test axes', function() { [ + { + formatter: '%H', + positions: ['2019-12-31 21:30', '2020-01-01 00:30', '2020-01-01 03:30', '2020-01-01 06:30', '2020-01-01 09:30', '2020-01-01 12:30', '2020-01-01 15:30', '2020-01-01 18:30', '2020-01-01 21:30', '2020-01-02 00:30'], + labels: ['', 'Wed-00', 'Wed-03', 'Wed-06', 'Wed-09', 'Wed-12', 'Wed-15', 'Wed-18', 'Wed-21', 'Thu-00'] + }, + { + formatter: '%I', + positions: ['2019-12-31 21:30', '2020-01-01 00:30', '2020-01-01 03:30', '2020-01-01 06:30', '2020-01-01 09:30', '2020-01-01 12:30', '2020-01-01 15:30', '2020-01-01 18:30', '2020-01-01 21:30', '2020-01-02 00:30'], + labels: ['', 'Wed-12', 'Wed-03', 'Wed-06', 'Wed-09', 'Wed-12', 'Wed-03', 'Wed-06', 'Wed-09', 'Thu-12'] + }, { formatter: '%p', positions: ['2019-12-31 21:00', '2020-01-01 06:00', '2020-01-01 18:00', '2020-01-02 06:00'], From c080bc51a4661af2137878fbdbbb46a104f5f9c5 Mon Sep 17 00:00:00 2001 From: archmoj Date: Tue, 1 Sep 2020 16:20:40 -0400 Subject: [PATCH 22/24] adjust period labels depending on break size --- src/plots/cartesian/axes.js | 9 ++++++++- test/jasmine/tests/axes_test.js | 22 +++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 0ddec230136..865128da9b1 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -838,7 +838,14 @@ axes.calcTicks = function calcTicks(ax, opts) { var r = c / nAll; if(ax.maskBreaks(A * (1 - r) + B * r) === BADNUM) nOut++; } - periodLength *= 1 - nOut / nAll; + var ratio = 1 - nOut / nAll; + if(ratio > 0.5) { + // case of short gap + periodLength *= ratio; + } else { + // case of big gap + periodLength = ratio * actualDelta; + } } if(periodLength <= actualDelta) { // i.e. to ensure new label positions remain between ticks diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 2af30f6fabe..10aa81c508b 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5867,37 +5867,37 @@ describe('Test axes', function() { [ { range: ['2020-12-14 08:00', '2022-12-14 08:00'], - positions: ['2020-12-06 10:26:47.1429', '2021-03-07 09:50:21.4286', '2021-06-06 16:26:47.1429', '2021-09-06 16:26:47.1429', '2021-12-07 09:50:21.4286', '2022-03-06 16:26:47.1429', '2022-06-06 16:26:47.1429', '2022-09-07 01:08:34.2857', '2022-12-07 01:08:34.2857'], - labels: ['', 'Mar 2021', 'Jun 2021', 'Sep 2021', 'Dec 2021', 'Mar 2022', 'Jun 2022', 'Sep 2022', 'Dec 2022'] + positions: ['2020-12-17 02:47:08.5714', '2021-03-19 20:51:25.7143', '2021-06-17 16:17:08.5714', '2021-09-17 12:00', '2021-12-19 11:08:34.2857', '2022-03-17 16:17:08.5714', '2022-06-17 16:17:08.5714', '2022-09-18 14:00', '2022-12-18 14:00'], + labels: ['Dec 2020', 'Mar 2021', 'Jun 2021', 'Sep 2021', 'Dec 2021', 'Mar 2022', 'Jun 2022', 'Sep 2022', ''] }, { range: ['2020-12-14 08:00', '2021-08-14 08:00'], - positions: ['2020-12-06 04:17:08.5714', '2020-12-27 22:00', '2021-01-24 22:00', '2021-02-21 22:00', '2021-03-21 22:00', '2021-04-18 22:00', '2021-05-16 22:00', '2021-06-13 22:00', '2021-07-11 22:00', '2021-08-08 22:00'], + positions: ['2020-12-08 17:21:25.7143', '2020-12-27 22:00', '2021-01-24 22:00', '2021-02-21 22:00', '2021-03-21 22:00', '2021-04-18 22:00', '2021-05-16 22:00', '2021-06-13 22:00', '2021-07-11 22:00', '2021-08-08 22:00'], labels: ['', 'Dec 21
2020', 'Jan 18
2021', 'Feb 15', 'Mar 15', 'Apr 12', 'May 10', 'Jun 7', 'Jul 5', 'Aug 2'] }, { range: ['2020-12-14 08:00', '2021-04-14 08:00'], - positions: ['2020-12-13 03:42:51.4286', '2020-12-21 11:42:51.4286', '2021-01-04 11:42:51.4286', '2021-01-18 11:42:51.4286', '2021-02-01 11:42:51.4286', '2021-02-15 11:42:51.4286', '2021-03-01 11:42:51.4286', '2021-03-15 11:42:51.4286', '2021-03-29 11:42:51.4286', '2021-04-12 11:42:51.4286'], - labels: ['', 'Dec 21
2020', 'Jan 4
2021', 'Jan 18', 'Feb 1', 'Feb 15', 'Mar 1', 'Mar 15', 'Mar 29', 'Apr 12'] + positions: ['2020-12-14 06:38:34.2857', '2020-12-24 14:00', '2021-01-07 14:00', '2021-01-21 14:00', '2021-02-04 14:00', '2021-02-18 14:00', '2021-03-04 14:00', '2021-03-18 14:00', '2021-04-01 14:00', '2021-04-15 14:00'], + labels: ['', 'Dec 21
2020', 'Jan 4
2021', 'Jan 18', 'Feb 1', 'Feb 15', 'Mar 1', 'Mar 15', 'Mar 29', ''] }, { range: ['2020-12-14 08:00', '2021-02-14 08:00'], - positions: ['2020-12-13 03:42:51.4286', '2020-12-21 10:17:08.5714', '2020-12-28 10:17:08.5714', '2021-01-04 10:17:08.5714', '2021-01-11 10:17:08.5714', '2021-01-18 10:17:08.5714', '2021-01-25 10:17:08.5714', '2021-02-01 10:17:08.5714', '2021-02-08 11:42:51.4286', '2021-02-14 13:42:51.4286'], + positions: ['2020-12-14 06:38:34.2857', '2020-12-22 12:00', '2020-12-29 12:00', '2021-01-05 12:00', '2021-01-12 12:00', '2021-01-19 12:00', '2021-01-26 12:00', '2021-02-02 12:00', '2021-02-09 16:45:42.8571', '2021-02-15 18:45:42.8571'], labels: ['', 'Dec 21
2020', 'Dec 28', 'Jan 4
2021', 'Jan 11', 'Jan 18', 'Jan 25', 'Feb 1', 'Feb 8', ''] }, { range: ['2020-12-14 08:00', '2021-01-14 08:00'], - positions: ['2020-12-14 05:08:34.2857', '2020-12-16 12:17:08.5714', '2020-12-18 09:08:34.2857', '2020-12-22 12:17:08.5714', '2020-12-24 09:08:34.2857', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 09:08:34.2857', '2021-01-05 12:17:08.5714', '2021-01-07 09:08:34.2857', '2021-01-11 12:17:08.5714', '2021-01-13 12:17:08.5714'], - labels: ['', 'Dec 16
2020', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', 'Jan 1
2021', 'Jan 5', 'Jan 7', 'Jan 11', 'Jan 13'] + positions: ['2020-12-14 11:34:17.1429', '2020-12-16 12:17:08.5714', '2020-12-18 18:34:17.1429', '2020-12-22 12:17:08.5714', '2020-12-24 18:34:17.1429', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 18:34:17.1429', '2021-01-05 12:17:08.5714', '2021-01-07 18:34:17.1429', '2021-01-11 12:17:08.5714', '2021-01-13 12:17:08.5714'], + labels: ['Dec 14
2020', 'Dec 16', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', 'Jan 1
2021', 'Jan 5', 'Jan 7', 'Jan 11', 'Jan 13'] }, { range: ['2020-12-14 08:00', '2021-01-01 08:00'], - positions: ['2020-12-14 05:08:34.2857', '2020-12-16 12:17:08.5714', '2020-12-18 09:08:34.2857', '2020-12-22 12:17:08.5714', '2020-12-24 09:08:34.2857', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 12:17:08.5714'], - labels: ['', 'Dec 16
2020', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', ''] + positions: ['2020-12-14 11:34:17.1429', '2020-12-16 12:17:08.5714', '2020-12-18 18:34:17.1429', '2020-12-22 12:17:08.5714', '2020-12-24 18:34:17.1429', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 12:17:08.5714'], + labels: ['Dec 14
2020', 'Dec 16', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', ''] }, { range: ['2020-12-14 08:00', '2020-12-22 08:00'], - positions: ['2020-12-14 04:51:25.7143', '2020-12-15 12:00', '2020-12-16 12:00', '2020-12-17 12:00', '2020-12-18 08:00', '2020-12-21 12:00', '2020-12-22 12:00'], + positions: ['2020-12-14 06:04:17.1429', '2020-12-15 12:00', '2020-12-16 12:00', '2020-12-17 12:00', '2020-12-18 12:00', '2020-12-21 12:00', '2020-12-22 12:00'], labels: ['', '06:00
Dec 15, 2020', '06:00
Dec 16, 2020', '06:00
Dec 17, 2020', '06:00
Dec 18, 2020', '06:00
Dec 21, 2020', ''] }, { From 4c10dddeea0373359ffc5b53fb860c39a1bbc753 Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 2 Sep 2020 11:35:18 -0400 Subject: [PATCH 23/24] adjust period labels for the case of big gaps --- src/plots/cartesian/axes.js | 6 +++++- test/jasmine/tests/axes_test.js | 18 +++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 865128da9b1..f3edcac3d3e 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -844,7 +844,11 @@ axes.calcTicks = function calcTicks(ax, opts) { periodLength *= ratio; } else { // case of big gap - periodLength = ratio * actualDelta; + if(actualDelta === ax.dtick) { + periodLength = ratio * actualDelta; + } else { + periodLength = ratio * (actualDelta + periodLength) / 2; + } } } diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 10aa81c508b..5467f54de1f 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5867,37 +5867,37 @@ describe('Test axes', function() { [ { range: ['2020-12-14 08:00', '2022-12-14 08:00'], - positions: ['2020-12-17 02:47:08.5714', '2021-03-19 20:51:25.7143', '2021-06-17 16:17:08.5714', '2021-09-17 12:00', '2021-12-19 11:08:34.2857', '2022-03-17 16:17:08.5714', '2022-06-17 16:17:08.5714', '2022-09-18 14:00', '2022-12-18 14:00'], - labels: ['Dec 2020', 'Mar 2021', 'Jun 2021', 'Sep 2021', 'Dec 2021', 'Mar 2022', 'Jun 2022', 'Sep 2022', ''] + positions: ['2020-12-11 18:36:57.8571', '2021-03-13 15:20:53.5714', '2021-06-12 04:21:57.8571', '2021-09-12 02:13:23.5714', '2021-12-13 10:29:27.8571', '2022-03-12 04:21:57.8571', '2022-06-12 04:21:57.8571', '2022-09-12 19:34:17.1429', '2022-12-12 19:34:17.1429'], + labels: ['', 'Mar 2021', 'Jun 2021', 'Sep 2021', 'Dec 2021', 'Mar 2022', 'Jun 2022', 'Sep 2022', 'Dec 2022'] }, { range: ['2020-12-14 08:00', '2021-08-14 08:00'], - positions: ['2020-12-08 17:21:25.7143', '2020-12-27 22:00', '2021-01-24 22:00', '2021-02-21 22:00', '2021-03-21 22:00', '2021-04-18 22:00', '2021-05-16 22:00', '2021-06-13 22:00', '2021-07-11 22:00', '2021-08-08 22:00'], + positions: ['2020-12-07 10:49:17.1429', '2020-12-27 22:00', '2021-01-24 22:00', '2021-02-21 22:00', '2021-03-21 22:00', '2021-04-18 22:00', '2021-05-16 22:00', '2021-06-13 22:00', '2021-07-11 22:00', '2021-08-08 22:00'], labels: ['', 'Dec 21
2020', 'Jan 18
2021', 'Feb 15', 'Mar 15', 'Apr 12', 'May 10', 'Jun 7', 'Jul 5', 'Aug 2'] }, { range: ['2020-12-14 08:00', '2021-04-14 08:00'], - positions: ['2020-12-14 06:38:34.2857', '2020-12-24 14:00', '2021-01-07 14:00', '2021-01-21 14:00', '2021-02-04 14:00', '2021-02-18 14:00', '2021-03-04 14:00', '2021-03-18 14:00', '2021-04-01 14:00', '2021-04-15 14:00'], - labels: ['', 'Dec 21
2020', 'Jan 4
2021', 'Jan 18', 'Feb 1', 'Feb 15', 'Mar 1', 'Mar 15', 'Mar 29', ''] + positions: ['2020-12-13 17:10:42.8571', '2020-12-23 00:51:25.7143', '2021-01-06 00:51:25.7143', '2021-01-20 00:51:25.7143', '2021-02-03 00:51:25.7143', '2021-02-17 00:51:25.7143', '2021-03-03 00:51:25.7143', '2021-03-17 00:51:25.7143', '2021-03-31 00:51:25.7143', '2021-04-14 00:51:25.7143'], + labels: ['', 'Dec 21
2020', 'Jan 4
2021', 'Jan 18', 'Feb 1', 'Feb 15', 'Mar 1', 'Mar 15', 'Mar 29', 'Apr 12'] }, { range: ['2020-12-14 08:00', '2021-02-14 08:00'], - positions: ['2020-12-14 06:38:34.2857', '2020-12-22 12:00', '2020-12-29 12:00', '2021-01-05 12:00', '2021-01-12 12:00', '2021-01-19 12:00', '2021-01-26 12:00', '2021-02-02 12:00', '2021-02-09 16:45:42.8571', '2021-02-15 18:45:42.8571'], + positions: ['2020-12-13 17:10:42.8571', '2020-12-22 12:00', '2020-12-29 12:00', '2021-01-05 12:00', '2021-01-12 12:00', '2021-01-19 12:00', '2021-01-26 12:00', '2021-02-02 12:00', '2021-02-09 02:14:17.1429', '2021-02-15 04:14:17.1429'], labels: ['', 'Dec 21
2020', 'Dec 28', 'Jan 4
2021', 'Jan 11', 'Jan 18', 'Jan 25', 'Feb 1', 'Feb 8', ''] }, { range: ['2020-12-14 08:00', '2021-01-14 08:00'], - positions: ['2020-12-14 11:34:17.1429', '2020-12-16 12:17:08.5714', '2020-12-18 18:34:17.1429', '2020-12-22 12:17:08.5714', '2020-12-24 18:34:17.1429', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 18:34:17.1429', '2021-01-05 12:17:08.5714', '2021-01-07 18:34:17.1429', '2021-01-11 12:17:08.5714', '2021-01-13 12:17:08.5714'], + positions: ['2020-12-14 08:21:25.7143', '2020-12-16 12:17:08.5714', '2020-12-18 13:51:25.7143', '2020-12-22 12:17:08.5714', '2020-12-24 13:51:25.7143', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 13:51:25.7143', '2021-01-05 12:17:08.5714', '2021-01-07 13:51:25.7143', '2021-01-11 12:17:08.5714', '2021-01-13 12:17:08.5714'], labels: ['Dec 14
2020', 'Dec 16', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', 'Jan 1
2021', 'Jan 5', 'Jan 7', 'Jan 11', 'Jan 13'] }, { range: ['2020-12-14 08:00', '2021-01-01 08:00'], - positions: ['2020-12-14 11:34:17.1429', '2020-12-16 12:17:08.5714', '2020-12-18 18:34:17.1429', '2020-12-22 12:17:08.5714', '2020-12-24 18:34:17.1429', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 12:17:08.5714'], + positions: ['2020-12-14 08:21:25.7143', '2020-12-16 12:17:08.5714', '2020-12-18 13:51:25.7143', '2020-12-22 12:17:08.5714', '2020-12-24 13:51:25.7143', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 12:17:08.5714'], labels: ['Dec 14
2020', 'Dec 16', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', ''] }, { range: ['2020-12-14 08:00', '2020-12-22 08:00'], - positions: ['2020-12-14 06:04:17.1429', '2020-12-15 12:00', '2020-12-16 12:00', '2020-12-17 12:00', '2020-12-18 12:00', '2020-12-21 12:00', '2020-12-22 12:00'], + positions: ['2020-12-14 05:27:51.4286', '2020-12-15 12:00', '2020-12-16 12:00', '2020-12-17 12:00', '2020-12-18 10:00', '2020-12-21 12:00', '2020-12-22 12:00'], labels: ['', '06:00
Dec 15, 2020', '06:00
Dec 16, 2020', '06:00
Dec 17, 2020', '06:00
Dec 18, 2020', '06:00
Dec 21, 2020', ''] }, { From 57750485be35d44ceee4e8f742843e1fe0f369ca Mon Sep 17 00:00:00 2001 From: archmoj Date: Wed, 2 Sep 2020 16:35:55 -0400 Subject: [PATCH 24/24] split sampling over first and second halves --- src/plots/cartesian/axes.js | 25 ++++++++++++------------- test/jasmine/tests/axes_test.js | 18 +++++++++--------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index f3edcac3d3e..0e27a0bfada 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -832,24 +832,23 @@ axes.calcTicks = function calcTicks(ax, opts) { } if(periodLength && ax.rangebreaks) { - var nOut = 0; + var nFirstHalf = 0; + var nSecondHalf = 0; var nAll = 2 * 3 * 7; // number of samples for(var c = 0; c < nAll; c++) { var r = c / nAll; - if(ax.maskBreaks(A * (1 - r) + B * r) === BADNUM) nOut++; - } - var ratio = 1 - nOut / nAll; - if(ratio > 0.5) { - // case of short gap - periodLength *= ratio; - } else { - // case of big gap - if(actualDelta === ax.dtick) { - periodLength = ratio * actualDelta; - } else { - periodLength = ratio * (actualDelta + periodLength) / 2; + if(ax.maskBreaks(A * (1 - r) + B * r) !== BADNUM) { + if(r < 0.5) { + nFirstHalf++; + } else { + nSecondHalf++; + } } } + + if(nSecondHalf) { + periodLength *= (nFirstHalf + nSecondHalf) / nAll; + } } if(periodLength <= actualDelta) { // i.e. to ensure new label positions remain between ticks diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 5467f54de1f..021c92d0a19 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -5867,37 +5867,37 @@ describe('Test axes', function() { [ { range: ['2020-12-14 08:00', '2022-12-14 08:00'], - positions: ['2020-12-11 18:36:57.8571', '2021-03-13 15:20:53.5714', '2021-06-12 04:21:57.8571', '2021-09-12 02:13:23.5714', '2021-12-13 10:29:27.8571', '2022-03-12 04:21:57.8571', '2022-06-12 04:21:57.8571', '2022-09-12 19:34:17.1429', '2022-12-12 19:34:17.1429'], + positions: ['2020-12-06 10:26:47.1429', '2021-03-07 09:50:21.4286', '2021-06-06 16:26:47.1429', '2021-09-06 16:26:47.1429', '2021-12-07 09:50:21.4286', '2022-03-06 16:26:47.1429', '2022-06-06 16:26:47.1429', '2022-09-07 01:08:34.2857', '2022-12-07 01:08:34.2857'], labels: ['', 'Mar 2021', 'Jun 2021', 'Sep 2021', 'Dec 2021', 'Mar 2022', 'Jun 2022', 'Sep 2022', 'Dec 2022'] }, { range: ['2020-12-14 08:00', '2021-08-14 08:00'], - positions: ['2020-12-07 10:49:17.1429', '2020-12-27 22:00', '2021-01-24 22:00', '2021-02-21 22:00', '2021-03-21 22:00', '2021-04-18 22:00', '2021-05-16 22:00', '2021-06-13 22:00', '2021-07-11 22:00', '2021-08-08 22:00'], + positions: ['2020-12-06 04:17:08.5714', '2020-12-27 22:00', '2021-01-24 22:00', '2021-02-21 22:00', '2021-03-21 22:00', '2021-04-18 22:00', '2021-05-16 22:00', '2021-06-13 22:00', '2021-07-11 22:00', '2021-08-08 22:00'], labels: ['', 'Dec 21
2020', 'Jan 18
2021', 'Feb 15', 'Mar 15', 'Apr 12', 'May 10', 'Jun 7', 'Jul 5', 'Aug 2'] }, { range: ['2020-12-14 08:00', '2021-04-14 08:00'], - positions: ['2020-12-13 17:10:42.8571', '2020-12-23 00:51:25.7143', '2021-01-06 00:51:25.7143', '2021-01-20 00:51:25.7143', '2021-02-03 00:51:25.7143', '2021-02-17 00:51:25.7143', '2021-03-03 00:51:25.7143', '2021-03-17 00:51:25.7143', '2021-03-31 00:51:25.7143', '2021-04-14 00:51:25.7143'], + positions: ['2020-12-13 03:42:51.4286', '2020-12-21 11:42:51.4286', '2021-01-04 11:42:51.4286', '2021-01-18 11:42:51.4286', '2021-02-01 11:42:51.4286', '2021-02-15 11:42:51.4286', '2021-03-01 11:42:51.4286', '2021-03-15 11:42:51.4286', '2021-03-29 11:42:51.4286', '2021-04-12 11:42:51.4286'], labels: ['', 'Dec 21
2020', 'Jan 4
2021', 'Jan 18', 'Feb 1', 'Feb 15', 'Mar 1', 'Mar 15', 'Mar 29', 'Apr 12'] }, { range: ['2020-12-14 08:00', '2021-02-14 08:00'], - positions: ['2020-12-13 17:10:42.8571', '2020-12-22 12:00', '2020-12-29 12:00', '2021-01-05 12:00', '2021-01-12 12:00', '2021-01-19 12:00', '2021-01-26 12:00', '2021-02-02 12:00', '2021-02-09 02:14:17.1429', '2021-02-15 04:14:17.1429'], + positions: ['2020-12-13 03:42:51.4286', '2020-12-21 10:17:08.5714', '2020-12-28 10:17:08.5714', '2021-01-04 10:17:08.5714', '2021-01-11 10:17:08.5714', '2021-01-18 10:17:08.5714', '2021-01-25 10:17:08.5714', '2021-02-01 10:17:08.5714', '2021-02-08 11:42:51.4286', '2021-02-14 13:42:51.4286'], labels: ['', 'Dec 21
2020', 'Dec 28', 'Jan 4
2021', 'Jan 11', 'Jan 18', 'Jan 25', 'Feb 1', 'Feb 8', ''] }, { range: ['2020-12-14 08:00', '2021-01-14 08:00'], - positions: ['2020-12-14 08:21:25.7143', '2020-12-16 12:17:08.5714', '2020-12-18 13:51:25.7143', '2020-12-22 12:17:08.5714', '2020-12-24 13:51:25.7143', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 13:51:25.7143', '2021-01-05 12:17:08.5714', '2021-01-07 13:51:25.7143', '2021-01-11 12:17:08.5714', '2021-01-13 12:17:08.5714'], - labels: ['Dec 14
2020', 'Dec 16', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', 'Jan 1
2021', 'Jan 5', 'Jan 7', 'Jan 11', 'Jan 13'] + positions: ['2020-12-14 05:08:34.2857', '2020-12-16 12:17:08.5714', '2020-12-18 09:08:34.2857', '2020-12-22 12:17:08.5714', '2020-12-24 18:00', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 09:08:34.2857', '2021-01-05 12:17:08.5714', '2021-01-07 18:00', '2021-01-11 12:17:08.5714', '2021-01-13 12:17:08.5714'], + labels: ['', 'Dec 16
2020', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', 'Jan 1
2021', 'Jan 5', 'Jan 7', 'Jan 11', 'Jan 13'] }, { range: ['2020-12-14 08:00', '2021-01-01 08:00'], - positions: ['2020-12-14 08:21:25.7143', '2020-12-16 12:17:08.5714', '2020-12-18 13:51:25.7143', '2020-12-22 12:17:08.5714', '2020-12-24 13:51:25.7143', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 12:17:08.5714'], - labels: ['Dec 14
2020', 'Dec 16', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', ''] + positions: ['2020-12-14 05:08:34.2857', '2020-12-16 12:17:08.5714', '2020-12-18 09:08:34.2857', '2020-12-22 12:17:08.5714', '2020-12-24 18:00', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 12:17:08.5714'], + labels: ['', 'Dec 16
2020', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', ''] }, { range: ['2020-12-14 08:00', '2020-12-22 08:00'], - positions: ['2020-12-14 05:27:51.4286', '2020-12-15 12:00', '2020-12-16 12:00', '2020-12-17 12:00', '2020-12-18 10:00', '2020-12-21 12:00', '2020-12-22 12:00'], + positions: ['2020-12-14 04:51:25.7143', '2020-12-15 18:00', '2020-12-16 18:00', '2020-12-17 18:00', '2020-12-18 18:00', '2020-12-21 18:00', '2020-12-22 18:00'], labels: ['', '06:00
Dec 15, 2020', '06:00
Dec 16, 2020', '06:00
Dec 17, 2020', '06:00
Dec 18, 2020', '06:00
Dec 21, 2020', ''] }, {