diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 62aedb1d05f..7199820b1e7 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -56,6 +56,15 @@ var autorange = require('./autorange'); axes.getAutoRange = autorange.getAutoRange; axes.findExtremes = autorange.findExtremes; +var epsilon = 0.0001; +function expandRange(range) { + var delta = (range[1] - range[0]) * epsilon; + return [ + range[0] - delta, + range[1] + delta + ]; +} + /* * find the list of possible axes to reference with an xref or yref attribute * and coerce it to that list @@ -566,8 +575,9 @@ axes.calcTicks = function calcTicks(ax) { ax._tmin = axes.tickFirst(ax); // add a tiny bit so we get ticks which may have rounded out - var startTick = rng[0] * 1.0001 - rng[1] * 0.0001; - var endTick = rng[1] * 1.0001 - rng[0] * 0.0001; + var exRng = expandRange(rng); + var startTick = exRng[0]; + var endTick = exRng[1]; // check for reversed axis var axrev = (rng[1] < rng[0]); @@ -691,10 +701,9 @@ function arrayTicks(ax) { var text = ax.ticktext; var ticksOut = new Array(vals.length); var rng = Lib.simpleMap(ax.range, ax.r2l); - var r0expanded = rng[0] * 1.0001 - rng[1] * 0.0001; - var r1expanded = rng[1] * 1.0001 - rng[0] * 0.0001; - var tickMin = Math.min(r0expanded, r1expanded); - var tickMax = Math.max(r0expanded, r1expanded); + var exRng = expandRange(rng); + var tickMin = Math.min(exRng[0], exRng[1]); + var tickMax = Math.max(exRng[0], exRng[1]); var j = 0; // without a text array, just format the given values as any other ticks @@ -956,10 +965,21 @@ axes.tickFirst = function(ax) { var sRound = axrev ? Math.floor : Math.ceil; // add a tiny extra bit to make sure we get ticks // that may have been rounded out - var r0 = rng[0] * 1.0001 - rng[1] * 0.0001; + var r0 = expandRange(rng)[0]; var dtick = ax.dtick; var tick0 = r2l(ax.tick0); + if(ax.rangebreaks && ax.maskBreaks(tick0) === BADNUM) { + // attempt move tick0 outside rangebreak + for(var h = 24; h > 0; h--) { + var delta = h * ONEHOUR; + if(ax.maskBreaks(tick0 - delta) !== BADNUM) { + tick0 -= delta; + break; + } + } + } + if(isNumeric(dtick)) { var tmin = sRound((r0 - tick0) / dtick) * dtick + tick0; diff --git a/test/image/baselines/axes_breaks-gridlines.png b/test/image/baselines/axes_breaks-gridlines.png index af5f4fd649c..ce0dd8824b9 100644 Binary files a/test/image/baselines/axes_breaks-gridlines.png and b/test/image/baselines/axes_breaks-gridlines.png differ diff --git a/test/image/baselines/axes_breaks-night_autorange-reversed.png b/test/image/baselines/axes_breaks-night_autorange-reversed.png index 8de472e9a5b..2a0cc5495ee 100644 Binary files a/test/image/baselines/axes_breaks-night_autorange-reversed.png and b/test/image/baselines/axes_breaks-night_autorange-reversed.png differ diff --git a/test/image/baselines/axes_breaks-rangeslider.png b/test/image/baselines/axes_breaks-rangeslider.png index b606ae82dc2..e0e0cdf8336 100644 Binary files a/test/image/baselines/axes_breaks-rangeslider.png and b/test/image/baselines/axes_breaks-rangeslider.png differ diff --git a/test/image/baselines/axes_breaks-tick0-position.png b/test/image/baselines/axes_breaks-tick0-position.png new file mode 100644 index 00000000000..91e56ef047d Binary files /dev/null and b/test/image/baselines/axes_breaks-tick0-position.png differ diff --git a/test/image/baselines/axes_breaks-weekends-weeknights.png b/test/image/baselines/axes_breaks-weekends-weeknights.png index c0b8991903e..88be27386f1 100644 Binary files a/test/image/baselines/axes_breaks-weekends-weeknights.png and b/test/image/baselines/axes_breaks-weekends-weeknights.png differ diff --git a/test/image/mocks/axes_breaks-tick0-position.json b/test/image/mocks/axes_breaks-tick0-position.json new file mode 100644 index 00000000000..01a4190b152 --- /dev/null +++ b/test/image/mocks/axes_breaks-tick0-position.json @@ -0,0 +1,218 @@ +{ + "data": [ + { + "type": "scatter", + "mode": "markers", + "x": [ + "1970-01-01T09:00:00", + "1970-01-01T10:00:00", + "1970-01-01T11:00:00", + "1970-01-01T12:00:00", + "1970-01-01T13:00:00", + "1970-01-01T14:00:00", + "1970-01-01T15:00:00", + "1970-01-01T16:00:00", + "1970-01-02T09:00:00", + "1970-01-02T10:00:00", + "1970-01-02T11:00:00", + "1970-01-02T12:00:00", + "1970-01-02T13:00:00", + "1970-01-02T14:00:00", + "1970-01-02T15:00:00", + "1970-01-02T16:00:00", + "1970-01-03T09:00:00", + "1970-01-03T10:00:00", + "1970-01-03T11:00:00", + "1970-01-03T12:00:00", + "1970-01-03T13:00:00", + "1970-01-03T14:00:00", + "1970-01-03T15:00:00", + "1970-01-03T16:00:00", + "1970-01-04T09:00:00", + "1970-01-04T10:00:00", + "1970-01-04T11:00:00", + "1970-01-04T12:00:00", + "1970-01-04T13:00:00", + "1970-01-04T14:00:00", + "1970-01-04T15:00:00", + "1970-01-04T16:00:00", + "1970-01-05T09:00:00", + "1970-01-05T10:00:00", + "1970-01-05T11:00:00", + "1970-01-05T12:00:00", + "1970-01-05T13:00:00", + "1970-01-05T14:00:00", + "1970-01-05T15:00:00", + "1970-01-05T16:00:00" + ], + "y": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40 + ] + }, + { + "type": "scatter", + "mode": "markers", + "x": [ + "1970-01-01T09:00:00", + "1970-01-01T10:00:00", + "1970-01-01T11:00:00", + "1970-01-01T12:00:00", + "1970-01-01T13:00:00", + "1970-01-01T14:00:00", + "1970-01-01T15:00:00", + "1970-01-01T16:00:00", + "1970-01-02T09:00:00", + "1970-01-02T10:00:00", + "1970-01-02T11:00:00", + "1970-01-02T12:00:00", + "1970-01-02T13:00:00", + "1970-01-02T14:00:00", + "1970-01-02T15:00:00", + "1970-01-02T16:00:00", + "1970-01-03T09:00:00", + "1970-01-03T10:00:00", + "1970-01-03T11:00:00", + "1970-01-03T12:00:00", + "1970-01-03T13:00:00", + "1970-01-03T14:00:00", + "1970-01-03T15:00:00", + "1970-01-03T16:00:00", + "1970-01-04T09:00:00", + "1970-01-04T10:00:00", + "1970-01-04T11:00:00", + "1970-01-04T12:00:00", + "1970-01-04T13:00:00", + "1970-01-04T14:00:00", + "1970-01-04T15:00:00", + "1970-01-04T16:00:00", + "1970-01-05T09:00:00", + "1970-01-05T10:00:00", + "1970-01-05T11:00:00", + "1970-01-05T12:00:00", + "1970-01-05T13:00:00", + "1970-01-05T14:00:00", + "1970-01-05T15:00:00", + "1970-01-05T16:00:00" + ], + "y": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40 + ], + "xaxis": "x2", + "yaxis": "y2" + } + ], + "layout": { + "width": 800, + "height": 400, + "showlegend": false, + "xaxis": { + "domain": [0, 0.45], + "dtick": 86400000, + "rangebreaks": [ + { + "bounds": [ + 17, + 9 + ], + "pattern": "hour" + } + ] + }, + "xaxis2": { + "domain": [0.55, 1], + "dtick": 86400000, + "rangebreaks": [ + { + "bounds": [ + 17, + 9 + ], + "pattern": "hour" + } + ], + "autorange": "reversed", + "anchor": "y2" + }, + "yaxis2": { + "anchor": "x2" + } + } +}