@@ -676,6 +676,90 @@ function adjustPeriodDelta(ax) { // adjusts ax.dtick and returns definedDelta
676
676
return definedDelta ;
677
677
}
678
678
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
+
679
763
// calculate the ticks: text, values, positioning
680
764
// if ticks are set to automatic, determine the right values (tick0,dtick)
681
765
// in any case, set tickround to # of digits to round tick labels to,
@@ -759,91 +843,9 @@ axes.calcTicks = function calcTicks(ax, opts) {
759
843
} ) ;
760
844
}
761
845
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 ) ;
846
847
848
+ var i ;
847
849
if ( ax . rangebreaks ) {
848
850
var flip = ax . _id . charAt ( 0 ) === 'y' ;
849
851
0 commit comments