Skip to content

Commit 0e01a5a

Browse files
authored
Merge pull request #4698 from plotly/rangebreak-increase-precision
Improve positioning of rangebreaks
2 parents e1de1af + a4a8f4a commit 0e01a5a

File tree

2 files changed

+57
-62
lines changed

2 files changed

+57
-62
lines changed

src/plots/cartesian/set_convert.js

+57-62
Original file line numberDiff line numberDiff line change
@@ -723,70 +723,65 @@ module.exports = function setConvert(ax, fullLayout) {
723723

724724
if(brk.enabled) {
725725
if(brk.bounds) {
726+
var t0 = r0;
727+
var t1 = r1;
726728
if(brk.pattern) {
727-
bnds = Lib.simpleMap(brk.bounds, cleanNumber);
728-
729-
// r0 value as date
730-
var r0Date = new Date(r0);
731-
// r0 value for break pattern
732-
var r0Pattern;
733-
// delta between r0 and first break in break pattern values
734-
var r0PatternDelta;
735-
// delta between break bounds in ms
736-
var bndDelta;
737-
// step in ms between rangebreaks
738-
var step;
739-
// tracker to position bounds
740-
var t;
741-
742-
switch(brk.pattern) {
743-
case WEEKDAY_PATTERN:
744-
b0 = bnds[0];
745-
b1 = bnds[1];
746-
r0Pattern = r0Date.getUTCDay();
747-
r0PatternDelta = b0 - r0Pattern;
748-
bndDelta = (b1 >= b0 ? b1 - b0 : (b1 + 7) - b0) * ONEDAY;
749-
step = 7 * ONEDAY;
750-
751-
t = r0 + r0PatternDelta * ONEDAY -
752-
r0Date.getUTCHours() * ONEHOUR -
753-
r0Date.getUTCMinutes() * ONEMIN -
754-
r0Date.getUTCSeconds() * ONESEC -
755-
r0Date.getUTCMilliseconds();
756-
break;
757-
case HOUR_PATTERN:
758-
b0 = bnds[0];
759-
b1 = bnds[1];
760-
r0Pattern = r0Date.getUTCHours();
761-
r0PatternDelta = b0 - r0Pattern;
762-
bndDelta = (b1 >= b0 ? b1 - b0 : (b1 + 24) - b0) * ONEHOUR;
763-
step = ONEDAY;
764-
765-
t = r0 + r0PatternDelta * ONEHOUR -
766-
r0Date.getUTCMinutes() * ONEMIN -
767-
r0Date.getUTCSeconds() * ONESEC -
768-
r0Date.getUTCMilliseconds();
769-
break;
770-
}
729+
// to remove decimal (most often found in auto ranges)
730+
t0 = Math.floor(t0);
731+
}
771732

772-
while(t <= r1) {
773-
// TODO we need to remove decimal (most often found
774-
// in auto ranges) for this to work correctly,
775-
// should this be Math.floor, Math.ceil or
776-
// Math.round ??
777-
addBreak(Math.floor(t), Math.floor(t + bndDelta));
778-
t += step;
779-
}
780-
} else {
781-
bnds = Lib.simpleMap(brk.bounds, ax.r2l);
782-
if(bnds[0] <= bnds[1]) {
783-
b0 = bnds[0];
784-
b1 = bnds[1];
785-
} else {
786-
b0 = bnds[1];
787-
b1 = bnds[0];
788-
}
789-
addBreak(b0, b1);
733+
bnds = Lib.simpleMap(brk.bounds, brk.pattern ? cleanNumber : ax.r2l);
734+
b0 = bnds[0];
735+
b1 = bnds[1];
736+
737+
// r0 value as date
738+
var t0Date = new Date(t0);
739+
// r0 value for break pattern
740+
var bndDelta;
741+
// step in ms between rangebreaks
742+
var step;
743+
744+
switch(brk.pattern) {
745+
case WEEKDAY_PATTERN:
746+
step = 7 * ONEDAY;
747+
748+
bndDelta = (
749+
(b1 < b0 ? 7 : 0) +
750+
(b1 - b0)
751+
) * ONEDAY;
752+
753+
t0 += b0 * ONEDAY - (
754+
t0Date.getUTCDay() * ONEDAY +
755+
t0Date.getUTCHours() * ONEHOUR +
756+
t0Date.getUTCMinutes() * ONEMIN +
757+
t0Date.getUTCSeconds() * ONESEC +
758+
t0Date.getUTCMilliseconds()
759+
);
760+
break;
761+
case HOUR_PATTERN:
762+
step = ONEDAY;
763+
764+
bndDelta = (
765+
(b1 < b0 ? 24 : 0) +
766+
(b1 - b0)
767+
) * ONEHOUR;
768+
769+
t0 += b0 * ONEHOUR - (
770+
t0Date.getUTCHours() * ONEHOUR +
771+
t0Date.getUTCMinutes() * ONEMIN +
772+
t0Date.getUTCSeconds() * ONESEC +
773+
t0Date.getUTCMilliseconds()
774+
);
775+
break;
776+
default:
777+
t0 = Math.min(bnds[0], bnds[1]);
778+
t1 = Math.max(bnds[0], bnds[1]);
779+
step = t1 - t0;
780+
bndDelta = step;
781+
}
782+
783+
for(var t = t0; t < t1; t += step) {
784+
addBreak(t, t + bndDelta);
790785
}
791786
} else {
792787
var vals = Lib.simpleMap(brk.values, ax.d2c);
Loading

0 commit comments

Comments
 (0)