@@ -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