docs: def fit_transform(self, X, y=None):
          """
          Fits the manifold on X and transforms the data to plot it on the axes.
          The optional y specified can be used to declare discrete colors. If
          the target is set to 'auto', this method also determines the target
          type, and therefore what colors will be used.
  
          Note also that fit records the amount of time it takes to fit the
          manifold and reports that information in the visualization.
  
          Parameters
          ----------
          X : array-like of shape (n, m)
              A matrix or data frame with n instances and m features where m > 2.
  
          y : array-like of shape (n,), optional
              A vector or series with target values for each instance in X. This
              vector is used to determine the color of the points in X.
  
          Returns
          -------
          self : Manifold
              Returns the visualizer object.
          """
          # Determine target type
          self._determine_target_color_type(y)
  
          # Compute classes and colors if target type is discrete
          if self._target_color_type == DISCRETE:
              self.classes_ = np.unique(y)
  
              color_kwargs = {'n_colors': len(self.classes_)}
  
              if isinstance(self.colors, str):
                  color_kwargs['colormap'] = self.colors
              else:
                  color_kwargs['colors'] = self.colors
  
              self._colors = resolve_colors(**color_kwargs)
  
          # Compute target range if colors are continuous
          elif self._target_color_type == CONTINUOUS:
              y = np.asarray(y)
              self.range_ = (y.min(), y.max())
  
          with Timer() as self.fit_time_:
              Xp = self.manifold.fit_transform(X)
  
          self.draw(Xp, y)
          return Xp