class_docstr: Class to determine tick marks
  
  Parameters
  ----------
  axis : instance of AxisVisual
      The AxisVisual to generate ticks for.
class_docstr_tok: ["Class","to","determine","tick","marks","Parameters","--","--","--","--","--","axis",":","instance","of","AxisVisual","The","AxisVisual","to","generate","ticks","for","."]
code: def _get_tick_positions(
      self, major_tick_fractions, minor_tick_fractions
  ):
      # tick direction is defined in visual coords, but use document
      # coords to determine the tick length
      trs = self.axis.transforms
      visual_to_document = trs.get_transform("visual", "document")
      direction = np.array(self.axis.tick_direction)
      direction /= np.linalg.norm(direction)
  
      if self._anchors is None:
          # use the document (pixel) coord system to set text anchors
          anchors = []
          if direction[0] < 0:
              anchors.append("right")
          elif direction[0] > 0:
              anchors.append("left")
          else:
              anchors.append("center")
          if direction[1] < 0:
              anchors.append("bottom")
          elif direction[1] > 0:
              anchors.append("top")
          else:
              anchors.append("middle")
      else:
          anchors = self._anchors
  
      # now figure out the tick positions in visual (data) coords
      doc_unit = visual_to_document.map([[0, 0], direction[:2]])
      doc_unit = doc_unit[1] - doc_unit[0]
      doc_len = np.linalg.norm(doc_unit)
  
      vectors = np.array(
          [
              [0.0, 0.0],
              direction * self.axis.minor_tick_length / doc_len,
              direction * self.axis.major_tick_length / doc_len,
              direction
              * (
                  self.axis.major_tick_length
                  + self.axis.tick_label_margin
              )
              / doc_len,
          ],
          dtype=float,
      )
      minor_vector = vectors[1] - vectors[0]
      major_vector = vectors[2] - vectors[0]
      label_vector = vectors[3] - vectors[0]
  
      axislabel_vector = (
          direction
          * (self.axis.major_tick_length + self.axis.axis_label_margin)
          / doc_len
      )
  
      major_origins, major_endpoints = self._tile_ticks(
          major_tick_fractions, major_vector
      )
  
      minor_origins, minor_endpoints = self._tile_ticks(
          minor_tick_fractions, minor_vector
      )
  
      tick_label_pos = major_origins + label_vector
  
      axis_label_pos = (
          0.5 * (self.axis.pos[0] + self.axis.pos[1]) + axislabel_vector
      )
  
      num_major = len(major_tick_fractions)
      num_minor = len(minor_tick_fractions)
  
      c = np.empty([(num_major + num_minor) * 2, 2])
  
      c[0 : (num_major - 1) * 2 + 1 : 2] = major_origins
      c[1 : (num_major - 1) * 2 + 2 : 2] = major_endpoints
      c[(num_major - 1) * 2 + 2 :: 2] = minor_origins
      c[(num_major - 1) * 2 + 3 :: 2] = minor_endpoints
  
      return c, tick_label_pos, axis_label_pos, anchors
  
imports: import math
  import numpy
  from .visual import CompoundVisual, updating_property
  from .line import LineVisual
  from .text import TextVisual
label_desc: Use image node_id 3 for calling the Ticker obj's underlying member method code with example usage: obj._get_tick_positions(major_tick_fractions, minor_tick_fractions) and returns: c,  tick_label_pos,  axis_label_pos,  anchors