docs: function (plot, axis, noTicks) {
          var ticks = [],
              minIdx = -1,
              maxIdx = -1,
              surface = plot.getCanvas(),
              logTickValues = PREFERRED_LOG_TICK_VALUES,
              min = clampAxis(axis, plot),
              max = axis.max;
  
          if (!noTicks) {
              noTicks = 0.3 * Math.sqrt(axis.direction === "x" ? surface.width : surface.height);
          }
  
          PREFERRED_LOG_TICK_VALUES.some(function (val, i) {
              if (val >= min) {
                  minIdx = i;
                  return true;
              } else {
                  return false;
              }
          });
  
          PREFERRED_LOG_TICK_VALUES.some(function (val, i) {
              if (val >= max) {
                  maxIdx = i;
                  return true;
              } else {
                  return false;
              }
          });
  
          if (maxIdx === -1) {
              maxIdx = PREFERRED_LOG_TICK_VALUES.length - 1;
          }
  
          if (maxIdx - minIdx <= noTicks / 4 && logTickValues.length !== EXTENDED_LOG_TICK_VALUES.length) {
              //try with multiple of 5 for tick values
              logTickValues = EXTENDED_LOG_TICK_VALUES;
              minIdx *= 2;
              maxIdx *= 2;
          }
  
          var lastDisplayed = null,
              inverseNoTicks = 1 / noTicks,
              tickValue, pixelCoord, tick;
  
          // Count the number of tick values would appear, if we can get at least
          // nTicks / 4 accept them.
          if (maxIdx - minIdx >= noTicks / 4) {
              for (var idx = maxIdx; idx >= minIdx; idx--) {
                  tickValue = logTickValues[idx];
                  pixelCoord = (Math.log(tickValue) - Math.log(min)) / (Math.log(max) - Math.log(min));
                  tick = tickValue;
  
                  if (lastDisplayed === null) {
                      lastDisplayed = {
                          pixelCoord: pixelCoord,
                          idealPixelCoord: pixelCoord
                      };
                  } else {
                      if (Math.abs(pixelCoord - lastDisplayed.pixelCoord) >= inverseNoTicks) {
                          lastDisplayed = {
                              pixelCoord: pixelCoord,
                              idealPixelCoord: lastDisplayed.idealPixelCoord - inverseNoTicks
                          };
                      } else {
                          tick = null;
                      }
                  }
  
                  if (tick) {
                      ticks.push(tick);
                  }
              }
              // Since we went in backwards order.
              ticks.reverse();
          } else {
              var tickSize = plot.computeTickSize(min, max, noTicks),
                  customAxis = {min: min, max: max, tickSize: tickSize};
              ticks = $.plot.linearTickGenerator(customAxis);
          }
  
          return ticks;
      }