@@ -592,7 +592,6 @@ axes.calcTicks = function calcTicks(ax, opts) {
592592 }
593593
594594 var isDLog = ( ax . type === 'log' ) && ! ( isNumeric ( ax . dtick ) || ax . dtick . charAt ( 0 ) === 'L' ) ;
595-
596595 var tickVals ;
597596 function generateTicks ( ) {
598597 var xPrevious = null ;
@@ -620,6 +619,16 @@ axes.calcTicks = function calcTicks(ax, opts) {
620619
621620 generateTicks ( ) ;
622621
622+ var isPeriod = ax . ticklabelmode === 'period' ;
623+ var addOneTickToStart = isPeriod && tickVals . length > 2 ;
624+
625+ if ( addOneTickToStart ) {
626+ tickVals . push ( {
627+ minor : false ,
628+ value : 2 * tickVals [ 0 ] . value - tickVals [ 1 ] . value
629+ } ) ;
630+ }
631+
623632 if ( ax . rangebreaks ) {
624633 // replace ticks inside breaks that would get a tick
625634 // and reduce ticks
@@ -684,7 +693,6 @@ axes.calcTicks = function calcTicks(ax, opts) {
684693 var minRange = Math . min ( rng [ 0 ] , rng [ 1 ] ) ;
685694 var maxRange = Math . max ( rng [ 0 ] , rng [ 1 ] ) ;
686695
687- var isPeriod = ax . ticklabelmode === 'period' ;
688696 var definedDelta ;
689697 if ( isPeriod && ax . tickformat ) {
690698 var _has = function ( str ) {
@@ -722,14 +730,23 @@ axes.calcTicks = function calcTicks(ax, opts) {
722730 if ( isPeriod ) {
723731 var v = tickVals [ i ] . value ;
724732
725- var a , b ;
726- if ( i === tickVals . length - 1 ) {
727- a = i - 1 ;
728- b = i ;
733+ var a = i ;
734+ var b = i + 1 ;
735+ if ( addOneTickToStart ) {
736+ if ( i === tickVals . length - 1 ) {
737+ a = i ;
738+ b = 0 ;
739+ } else if ( i === tickVals . length - 2 ) {
740+ a = i - 1 ;
741+ b = i ;
742+ }
729743 } else {
730- a = i ;
731- b = i + 1 ;
744+ if ( i === tickVals . length - 1 ) {
745+ a = i - 1 ;
746+ b = i ;
747+ }
732748 }
749+
733750 var A = tickVals [ a ] . value ;
734751 var B = tickVals [ b ] . value ;
735752
0 commit comments