docs: def fit(self, X, y=None, **kwargs):
          """
          The fit method is the primary drawing input for the UMAP projection
          since the visualization requires both X and an optional y value. The
          fit method expects an array of numeric vectors, so text documents must
          be vectorized before passing them to this method.
  
          Parameters
          ----------
          X : ndarray or DataFrame of shape n x m
              A matrix of n instances with m features representing the corpus of
              vectorized documents to visualize with UMAP.
  
          y : ndarray or Series of length n
              An optional array or series of target or class values for
              instances. If this is specified, then the points will be colored
              according to their class. Often cluster labels are passed in to
              color the documents in cluster space, so this method is used both
              for classification and clustering methods.
  
          kwargs : dict
              Pass generic arguments to the drawing method
  
          Returns
          -------
          self : instance
              Returns the instance of the transformer/visualizer
          """
  
          # Store the classes we observed in y
          if y is not None:
              self.classes_ = np.unique(y)
          elif y is None and self.labels is not None:
              self.classes_ = np.array([self.labels[0]])
          else:
              self.classes_ = np.array([self.NULL_CLASS])
  
          # Fit our internal transformer and transform the data.
          vecs = self.transformer_.fit_transform(X)
          self.n_instances_ = vecs.shape[0]
  
          # Draw the vectors
          self.draw(vecs, y, **kwargs)
  
          # Fit always returns self.
          return self