code: def _calc_ticks(value_range, base):
          
          def _minor(x, mid_idx):
              return np.hstack([x[1:mid_idx], x[mid_idx+1:-1]])
  
          # * Calculate the low and high powers,
          # * Generate for all intervals in along the low-high power range
          #   The intervals are in normal space
          # * Calculate evenly spaced breaks in normal space, then convert
          #   them to log space.
          low = np.floor(value_range[0])
          high = np.ceil(value_range[1])
          arr = base ** np.arange(low, float(high+1))
          n_ticks = base - 1
          breaks = [log(np.linspace(b1, b2, n_ticks+1), base)
                    for (b1, b2) in list(zip(arr, arr[1:]))]
  
          # Partition the breaks in the 3 groups
          major = np.array([x[0] for x in breaks] + [breaks[-1][-1]])
          if n_ticks % 2:
              mid_idx = n_ticks // 2
              middle = [x[mid_idx] for x in breaks]
              minor = np.hstack([_minor(x, mid_idx) for x in breaks])
          else:
              middle = []
              minor = np.hstack([x[1:-1] for x in breaks])
  
          return major, middle, minor
docs: Calculate tick marks within a range
  
          Parameters
          ----------
          value_range: tuple
              Range for which to calculate ticks.
  
          Returns
          -------
          out: tuple
              (major, middle, minor) tick locations