class_docstr: An Axis class for the 3D plots.
code: def draw(self, renderer):
      self.label._transform = self.axes.transData
      self.offsetText._transform = self.axes.transData
      renderer.open_group("axis3d", gid=self.get_gid())
  
      # Get general axis information:
      mins, maxs, centers, deltas, tc, highs = self._get_coord_info(
          renderer
      )
  
      # Calculate offset distances
      # A rough estimate; points are ambiguous since 3D plots rotate
      reltoinches = self.figure.dpi_scale_trans.inverted()
      ax_inches = reltoinches.transform(self.axes.bbox.size)
      ax_points_estimate = sum(72.0 * ax_inches)
      deltas_per_point = 48 / ax_points_estimate
      default_offset = 21.0
      labeldeltas = (
          (self.labelpad + default_offset) * deltas_per_point * deltas
      )
  
      # Determine edge points for the axis lines
      minmax = np.where(highs, maxs, mins)  # "origin" point
      maxmin = np.where(
          ~highs, maxs, mins
      )  # "opposite" corner near camera
  
      for edgep1, edgep2, pos in zip(
          *self._get_all_axis_line_edge_points(
              minmax, maxmin, self._tick_position
          )
      ):
          # Project the edge points along the current position
          pep = proj3d._proj_trans_points([edgep1, edgep2], self.axes.M)
          pep = np.asarray(pep)
  
          # The transAxes transform is used because the Text object
          # rotates the text relative to the display coordinate system.
          # Therefore, if we want the labels to remain parallel to the
          # axis regardless of the aspect ratio, we need to convert the
          # edge points of the plane to display coordinates and calculate
          # an angle from that.
          # TODO: Maybe Text objects should handle this themselves?
          dx, dy = (
              self.axes.transAxes.transform([pep[0:2, 1]])
              - self.axes.transAxes.transform([pep[0:2, 0]])
          )[0]
  
          # Draw the lines
          self.line.set_data(pep[0], pep[1])
          self.line.draw(renderer)
  
          # Draw ticks
          self._draw_ticks(
              renderer,
              edgep1,
              centers,
              deltas,
              highs,
              deltas_per_point,
              pos,
          )
  
          # Draw Offset text
          self._draw_offset_text(
              renderer,
              edgep1,
              edgep2,
              labeldeltas,
              centers,
              highs,
              pep,
              dx,
              dy,
          )
  
      for edgep1, edgep2, pos in zip(
          *self._get_all_axis_line_edge_points(
              minmax, maxmin, self._label_position
          )
      ):
          # See comments above
          pep = proj3d._proj_trans_points([edgep1, edgep2], self.axes.M)
          pep = np.asarray(pep)
          dx, dy = (
              self.axes.transAxes.transform([pep[0:2, 1]])
              - self.axes.transAxes.transform([pep[0:2, 0]])
          )[0]
  
          # Draw labels
          self._draw_labels(
              renderer, edgep1, edgep2, labeldeltas, centers, dx, dy
          )
  
      renderer.close_group("axis3d")
      self.stale = False
  
imports: import inspect
  import numpy
  import matplotlib
  from matplotlib import _api, artist, lines, axis, patches, transforms, colors
  from .None import art3d, proj3d
label_desc: Use image node_id 25 for calling the Axis obj's underlying member method code with example usage: obj.draw(renderer) without return types