docs: function () {
          var axis = this;
          var labelModel = axis.getLabelModel();
  
          var ordinalScale = axis.scale;
          var ordinalExtent = ordinalScale.getExtent();
          // Providing this method is for optimization:
          // avoid generating a long array by `getTicks`
          // in large category data case.
          var tickCount = ordinalScale.count();
  
          if (ordinalExtent[1] - ordinalExtent[0] < 1) {
              return 0;
          }
  
          var tickValue = ordinalExtent[0];
          var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue);
          var unitH = Math.abs(unitSpan);
  
          // Not precise, just use height as text width
          // and each distance from axis line yet.
          var rect = textContain.getBoundingRect(
              tickValue, labelModel.getFont(), 'center', 'top'
          );
          var maxH = Math.max(rect.height, 7);
  
          var dh = maxH / unitH;
          // 0/0 is NaN, 1/0 is Infinity.
          isNaN(dh) && (dh = Infinity);
          var interval = Math.max(0, Math.floor(dh));
  
          var cache = inner(axis.model);
          var lastAutoInterval = cache.lastAutoInterval;
          var lastTickCount = cache.lastTickCount;
  
          // Use cache to keep interval stable while moving zoom window,
          // otherwise the calculated interval might jitter when the zoom
          // window size is close to the interval-changing size.
          if (lastAutoInterval != null
              && lastTickCount != null
              && Math.abs(lastAutoInterval - interval) <= 1
              && Math.abs(lastTickCount - tickCount) <= 1
              // Always choose the bigger one, otherwise the critical
              // point is not the same when zooming in or zooming out.
              && lastAutoInterval > interval
          ) {
              interval = lastAutoInterval;
          }
          // Only update cache if cache not used, otherwise the
          // changing of interval is too insensitive.
          else {
              cache.lastTickCount = tickCount;
              cache.lastAutoInterval = interval;
          }
  
          return interval;
      }