Skip to content

Commit b78a80b

Browse files
committed
move and refactor period tick positioning logic inside a function
1 parent c42358c commit b78a80b

File tree

1 file changed

+86
-84
lines changed

1 file changed

+86
-84
lines changed

src/plots/cartesian/axes.js

+86-84
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,90 @@ function adjustPeriodDelta(ax) { // adjusts ax.dtick and returns definedDelta
676676
return definedDelta;
677677
}
678678

679+
function positionPeriodTicks(tickVals, ax, definedDelta) {
680+
for(var i = 0; i < tickVals.length; i++) {
681+
var v = tickVals[i].value;
682+
683+
var a = i;
684+
var b = i + 1;
685+
if(i < tickVals.length - 1) {
686+
a = i;
687+
b = i + 1;
688+
} else if(i > 0) {
689+
a = i - 1;
690+
b = i;
691+
} else {
692+
a = i;
693+
b = i;
694+
}
695+
696+
var A = tickVals[a].value;
697+
var B = tickVals[b].value;
698+
var actualDelta = Math.abs(B - A);
699+
var delta = definedDelta || actualDelta;
700+
var periodLength = 0;
701+
702+
if(delta >= ONEMINYEAR) {
703+
if(actualDelta >= ONEMINYEAR && actualDelta <= ONEMAXYEAR) {
704+
periodLength = actualDelta;
705+
} else {
706+
periodLength = ONEAVGYEAR;
707+
}
708+
} else if(definedDelta === ONEAVGQUARTER && delta >= ONEMINQUARTER) {
709+
if(actualDelta >= ONEMINQUARTER && actualDelta <= ONEMAXQUARTER) {
710+
periodLength = actualDelta;
711+
} else {
712+
periodLength = ONEAVGQUARTER;
713+
}
714+
} else if(delta >= ONEMINMONTH) {
715+
if(actualDelta >= ONEMINMONTH && actualDelta <= ONEMAXMONTH) {
716+
periodLength = actualDelta;
717+
} else {
718+
periodLength = ONEAVGMONTH;
719+
}
720+
} else if(definedDelta === ONEWEEK && delta >= ONEWEEK) {
721+
periodLength = ONEWEEK;
722+
} else if(delta >= ONEDAY) {
723+
periodLength = ONEDAY;
724+
} else if(definedDelta === HALFDAY && delta >= HALFDAY) {
725+
periodLength = HALFDAY;
726+
} else if(definedDelta === ONEHOUR && delta >= ONEHOUR) {
727+
periodLength = ONEHOUR;
728+
}
729+
730+
var inBetween;
731+
if(periodLength >= actualDelta) {
732+
// ensure new label positions remain between ticks
733+
periodLength = actualDelta;
734+
inBetween = true;
735+
}
736+
737+
var endPeriod = v + periodLength;
738+
if(ax.rangebreaks && periodLength > 0) {
739+
var nAll = 84; // highly divisible 7 * 12
740+
var n = 0;
741+
for(var c = 0; c < nAll; c++) {
742+
var r = (c + 0.5) / nAll;
743+
if(ax.maskBreaks(v * (1 - r) + r * endPeriod) !== BADNUM) n++;
744+
}
745+
periodLength *= n / nAll;
746+
747+
if(!periodLength) {
748+
tickVals[i].drop = true;
749+
}
750+
751+
if(inBetween && actualDelta > ONEWEEK) periodLength = actualDelta; // center monthly & longer periods
752+
}
753+
754+
if(
755+
periodLength > 0 || // not instant
756+
i === 0 // taking care first tick added
757+
) {
758+
tickVals[i].periodX = v + periodLength / 2;
759+
}
760+
}
761+
}
762+
679763
// calculate the ticks: text, values, positioning
680764
// if ticks are set to automatic, determine the right values (tick0,dtick)
681765
// in any case, set tickround to # of digits to round tick labels to,
@@ -759,91 +843,9 @@ axes.calcTicks = function calcTicks(ax, opts) {
759843
});
760844
}
761845

762-
var i;
763-
if(isPeriod) {
764-
for(i = 0; i < tickVals.length; i++) {
765-
var v = tickVals[i].value;
766-
767-
var a = i;
768-
var b = i + 1;
769-
if(i < tickVals.length - 1) {
770-
a = i;
771-
b = i + 1;
772-
} else if(i > 0) {
773-
a = i - 1;
774-
b = i;
775-
} else {
776-
a = i;
777-
b = i;
778-
}
779-
780-
var A = tickVals[a].value;
781-
var B = tickVals[b].value;
782-
var actualDelta = Math.abs(B - A);
783-
var delta = definedDelta || actualDelta;
784-
var periodLength = 0;
785-
786-
if(delta >= ONEMINYEAR) {
787-
if(actualDelta >= ONEMINYEAR && actualDelta <= ONEMAXYEAR) {
788-
periodLength = actualDelta;
789-
} else {
790-
periodLength = ONEAVGYEAR;
791-
}
792-
} else if(definedDelta === ONEAVGQUARTER && delta >= ONEMINQUARTER) {
793-
if(actualDelta >= ONEMINQUARTER && actualDelta <= ONEMAXQUARTER) {
794-
periodLength = actualDelta;
795-
} else {
796-
periodLength = ONEAVGQUARTER;
797-
}
798-
} else if(delta >= ONEMINMONTH) {
799-
if(actualDelta >= ONEMINMONTH && actualDelta <= ONEMAXMONTH) {
800-
periodLength = actualDelta;
801-
} else {
802-
periodLength = ONEAVGMONTH;
803-
}
804-
} else if(definedDelta === ONEWEEK && delta >= ONEWEEK) {
805-
periodLength = ONEWEEK;
806-
} else if(delta >= ONEDAY) {
807-
periodLength = ONEDAY;
808-
} else if(definedDelta === HALFDAY && delta >= HALFDAY) {
809-
periodLength = HALFDAY;
810-
} else if(definedDelta === ONEHOUR && delta >= ONEHOUR) {
811-
periodLength = ONEHOUR;
812-
}
813-
814-
var inBetween;
815-
if(periodLength >= actualDelta) {
816-
// ensure new label positions remain between ticks
817-
periodLength = actualDelta;
818-
inBetween = true;
819-
}
820-
821-
var endPeriod = v + periodLength;
822-
if(ax.rangebreaks && periodLength > 0) {
823-
var nAll = 84; // highly divisible 7 * 12
824-
var n = 0;
825-
for(var c = 0; c < nAll; c++) {
826-
var r = (c + 0.5) / nAll;
827-
if(ax.maskBreaks(v * (1 - r) + r * endPeriod) !== BADNUM) n++;
828-
}
829-
periodLength *= n / nAll;
830-
831-
if(!periodLength) {
832-
tickVals[i].drop = true;
833-
}
834-
835-
if(inBetween && actualDelta > ONEWEEK) periodLength = actualDelta; // center monthly & longer periods
836-
}
837-
838-
if(
839-
periodLength > 0 || // not instant
840-
i === 0 // taking care first tick added
841-
) {
842-
tickVals[i].periodX = v + periodLength / 2;
843-
}
844-
}
845-
}
846+
if(isPeriod) positionPeriodTicks(tickVals, ax, definedDelta);
846847

848+
var i;
847849
if(ax.rangebreaks) {
848850
var flip = ax._id.charAt(0) === 'y';
849851

0 commit comments

Comments
 (0)