class_docstr: GraphicsItem showing a single plot axis with ticks, values, and label.
  Can be configured to fit on any side of a plot, 
  Can automatically synchronize its displayed scale with ViewBox items.
  Ticks can be extended to draw a grid.
  If maxTickLength is negative, ticks point into the plot.
docstr: Return the values and spacing of ticks to draw::
  
      [
          (spacing, [major ticks]),
          (spacing, [minor ticks]),
          ...
      ]
  
  By default, this method calls tickSpacing to determine the correct tick locations.
  This is a good method to override in subclasses.
docstr_tok: ["Return","the","values","and","spacing","of","ticks","to","draw",":",":","[","(","spacing",",","[","major","ticks","]",")",",","(","spacing",",","[","minor","ticks","]",")",",","...","]","By","default",",","this","method","calls","tickSpacing","to","determine","the","correct","tick","locations",".","This","is","a","good","method","to","override","in","subclasses","."]
code: def tickValues(self, minVal, maxVal, size):
      """
      Return the values and spacing of ticks to draw::
  
          [
              (spacing, [major ticks]),
              (spacing, [minor ticks]),
              ...
          ]
  
      By default, this method calls tickSpacing to determine the correct tick locations.
      This is a good method to override in subclasses.
      """
      minVal, maxVal = sorted((minVal, maxVal))
  
      minVal *= self.scale
      maxVal *= self.scale
      # size *= self.scale
  
      ticks = []
      tickLevels = self.tickSpacing(minVal, maxVal, size)
      allValues = np.array([])
      for i in range(len(tickLevels)):
          spacing, offset = tickLevels[i]
  
          ## determine starting tick
          start = (ceil((minVal - offset) / spacing) * spacing) + offset
  
          ## determine number of ticks
          num = int((maxVal - start) / spacing) + 1
          values = (np.arange(num) * spacing + start) / self.scale
          ## remove any ticks that were present in higher levels
          ## we assume here that if the difference between a tick value and a previously seen tick value
          ## is less than spacing/100, then they are 'equal' and we can ignore the new tick.
          close = np.any(
              np.isclose(
                  allValues,
                  values[:, np.newaxis],
                  rtol=0,
                  atol=spacing / self.scale * 0.01,
              ),
              axis=-1,
          )
          values = values[~close]
          allValues = np.concatenate([allValues, values])
          ticks.append((spacing / self.scale, values.tolist()))
  
      if self.logMode:
          return self.logTickValues(minVal, maxVal, size, ticks)
  
      # nticks = []
      # for t in ticks:
      # nvals = []
      # for v in t[1]:
      # nvals.append(v/self.scale)
      # nticks.append((t[0]/self.scale,nvals))
      # ticks = nticks
  
      return ticks
  
imports: import weakref
  from math import ceil, floor, isfinite, log10, sqrt, frexp, floor
  import numpy
  from ..None import debug
  from ..None import functions
  from ..None import getConfigOption
  from ..Point import Point
  from ..Qt import QtCore, QtGui, QtWidgets
  from .GraphicsWidget import GraphicsWidget
label_desc: Use image node_id 39 for calling the AxisItem obj's underlying member method code with example usage: obj.tickValues(minVal, maxVal, size) and returns: ticks, self