@@ -803,7 +803,8 @@ axes.calcTicks = function calcTicks(ax, opts) {
803803 var minRange = Math . min ( rng [ 0 ] , rng [ 1 ] ) ;
804804 var maxRange = Math . max ( rng [ 0 ] , rng [ 1 ] ) ;
805805
806- var isDLog = ( ax . type === 'log' ) && ! ( isNumeric ( ax . dtick ) || ax . dtick . charAt ( 0 ) === 'L' ) ;
806+ var numDtick = isNumeric ( ax . dtick ) ;
807+ var isDLog = ( ax . type === 'log' ) && ! ( numDtick || ax . dtick . charAt ( 0 ) === 'L' ) ;
807808 var isPeriod = ax . ticklabelmode === 'period' ;
808809
809810 // find the first tick
@@ -834,13 +835,36 @@ axes.calcTicks = function calcTicks(ax, opts) {
834835 x = axes . tickIncrement ( x , ax . dtick , ! axrev , ax . calendar ) ;
835836 }
836837
838+ var ticklabelstep = ax . ticklabelstep ;
839+
837840 var maxTicks = Math . max ( 1000 , ax . _length || 0 ) ;
838841 var tickVals = [ ] ;
839842 var xPrevious = null ;
843+
844+ var dTick ;
845+ if ( numDtick ) {
846+ dTick = ax . dtick ;
847+ } else {
848+ if ( ax . type === 'date' ) {
849+ if ( typeof ax . dtick === 'string' && ax . dtick . charAt ( 0 ) === 'M' ) {
850+ dTick = ONEAVGMONTH * ax . dtick . substring ( 1 ) ;
851+ }
852+ } else {
853+ dTick = ax . _roughDTick ;
854+ }
855+ }
856+
857+ var id = Math . round ( (
858+ ax . r2l ( x ) -
859+ ax . r2l ( ax . tick0 )
860+ ) / dTick ) - 1 ;
861+
840862 for ( ;
841863 ( axrev ) ? ( x >= endTick ) : ( x <= endTick ) ;
842864 x = axes . tickIncrement ( x , ax . dtick , axrev , ax . calendar )
843865 ) {
866+ id ++ ;
867+
844868 if ( ax . rangebreaks ) {
845869 if ( ! axrev ) {
846870 if ( x < startTick ) continue ;
@@ -858,10 +882,16 @@ axes.calcTicks = function calcTicks(ax, opts) {
858882 minor = true ;
859883 }
860884
861- tickVals . push ( {
885+ var obj = {
862886 minor : minor ,
863887 value : x
864- } ) ;
888+ } ;
889+
890+ if ( ticklabelstep > 1 && id % ticklabelstep ) {
891+ obj . skipLabel = true ;
892+ }
893+
894+ tickVals . push ( obj ) ;
865895 }
866896
867897 if ( isPeriod ) positionPeriodTicks ( tickVals , ax , ax . _definedDelta ) ;
@@ -914,12 +944,20 @@ axes.calcTicks = function calcTicks(ax, opts) {
914944 ax . _prevDateHead = '' ;
915945 ax . _inCalcTicks = true ;
916946
947+ var lastVisibleHead ;
948+ var hideLabel = function ( tick ) {
949+ tick . text = ' ' ; // don't use an empty string here which can confuse automargin (issue 5132)
950+ ax . _prevDateHead = lastVisibleHead ;
951+ } ;
952+
917953 var ticksOut = [ ] ;
918954 var t , p ;
919955 for ( i = 0 ; i < tickVals . length ; i ++ ) {
920956 var _minor = tickVals [ i ] . minor ;
921957 var _value = tickVals [ i ] . value ;
922958
959+ lastVisibleHead = ax . _prevDateHead ;
960+
923961 t = axes . tickText (
924962 ax ,
925963 _value ,
@@ -934,11 +972,14 @@ axes.calcTicks = function calcTicks(ax, opts) {
934972 if ( p > maxRange ) t . periodX = maxRange ;
935973 if ( p < minRange ) t . periodX = minRange ;
936974
937- t . text = ' ' ; // don't use an empty string here which can confuse automargin (issue 5132)
938- ax . _prevDateHead = '' ;
975+ hideLabel ( t ) ;
939976 }
940977 }
941978
979+ if ( tickVals [ i ] . skipLabel ) {
980+ hideLabel ( t ) ;
981+ }
982+
942983 ticksOut . push ( t ) ;
943984 }
944985
@@ -2966,6 +3007,7 @@ axes.drawLabels = function(gd, ax, opts) {
29663007 var axId = ax . _id ;
29673008 var axLetter = axId . charAt ( 0 ) ;
29683009 var cls = opts . cls || axId + 'tick' ;
3010+
29693011 var vals = opts . vals ;
29703012
29713013 var labelFns = opts . labelFns ;
0 commit comments