class_docstr: Visualize Multiple-dimensional data
  
  This class enables the visualization of multi-dimensional data, using
  a triangular grid of 2D plots.
  
  Parameters
  ----------
  ndim : integer
      Number of data dimensions
  inner_labels : bool
      If true, then label the inner axes.  If false, then only the outer
      axes will be labeled
  fig : matplotlib.Figure
      if specified, draw the plot on this figure.  Otherwise, use the
      current active figure.
  left, bottom, right, top, wspace, hspace : floats
      these parameters control the layout of the plots.  They behave have
      an identical effect as the arguments to plt.subplots_adjust.  If not
      specified, default values from the rc file will be used.
  
  Examples
  --------
  A grid of scatter plots can be created as follows::
  
      x = np.random.normal((4, 1000))
      R = np.random.random((4, 4))  # projection matrix
      x = np.dot(R, x)
      ax = MultiAxes(4)
      ax.scatter(x)
      ax.set_labels(['x1', 'x2', 'x3', 'x4'])
  
  Alternatively, the scatter plot can be visualized as a density::
  
      ax = MultiAxes(4)
      ax.density(x, bins=[20, 20, 20, 20])
code: def _draw_panels(self):
      # Import here so that testing with Agg will work
      from matplotlib import pyplot as plt
  
      if self.top <= self.bottom:
          raise ValueError("top must be larger than bottom")
      if self.right <= self.left:
          raise ValueError("right must be larger than left")
  
      ndim = self.ndim
  
      panel_width = (self.right - self.left) / (
          ndim - 1 + self.wspace * (ndim - 2)
      )
      panel_height = (self.top - self.bottom) / (
          ndim - 1 + self.hspace * (ndim - 2)
      )
  
      full_panel_width = (1 + self.wspace) * panel_width
      full_panel_height = (1 + self.hspace) * panel_height
  
      axes = np.empty((ndim, ndim), dtype=object)
      axes.fill(None)
  
      for j in range(1, ndim):
          for i in range(j):
              left = self.left + i * full_panel_width
              right = self.bottom + (ndim - 1 - j) * full_panel_height
              ax = self.fig.add_axes(
                  [left, right, panel_width, panel_height]
              )
              axes[i, j] = ax
  
      if not self.inner_labels:
          # remove unneeded x labels
          for i in range(ndim):
              for j in range(ndim - 1):
                  ax = axes[i, j]
                  if ax is not None:
                      ax.xaxis.set_major_formatter(plt.NullFormatter())
  
          # remove unneeded y labels
          for i in range(1, ndim):
              for j in range(ndim):
                  ax = axes[i, j]
                  if ax is not None:
                      ax.yaxis.set_major_formatter(plt.NullFormatter())
  
      return np.asarray(axes, dtype=object)
  
file_path: astroML/astroML/plotting/multiaxes.py
imports: from copy import deepcopy
  import numpy
label_desc: Use image node_id 4 for calling the MultiAxes obj's underlying member method code with example usage: obj._draw_panels() and returns: np