docs: def fit(self, X, y=None, **kwargs):
          """
          The fit method is the primary drawing input for the
          visualization since it has both the X and y data required for the
          viz and the transform method does not.
  
          Parameters
          ----------
          X : ndarray or DataFrame of shape n x m
              A matrix of n instances with m features
  
          y : ndarray or Series of length n
              An array or series of target or class values
  
          kwargs : dict
              Pass generic arguments to the drawing method
  
          Returns
          -------
          self : instance
              Returns the instance of the transformer/visualizer
          """
  
          # Convert from pandas data types
          if is_dataframe(X):
              # Get column names before reverting to an np.ndarray
              if self.features_ is None:
                  self.features_ = np.array(X.columns)
  
              X = X.values
          if is_series(y):
              y = y.values
  
          # Assign integer labels to the feature columns from the input
          if self.features_ is None:
              self.features_ = np.arange(0, X.shape[1])
  
          # Ensure that all classes are represented in the color mapping (before sample)
          # NOTE: np.unique also specifies the ordering of the classes
          if self.classes_ is None:
              self.classes_ = [str(label) for label in np.unique(y)]
  
          # Create the color mapping for each class
          # TODO: Allow both colormap, listed colors, and palette definition
          # TODO: Make this an independent function or property for override!
          color_values = resolve_colors(
              n_colors=len(self.classes_), colormap=self.colormap, colors=self.color
          )
          self._colors = dict(zip(self.classes_, color_values))
  
          # Ticks for each feature specified
          self._increments = np.arange(len(self.features_))
  
          # Subsample instances
          X, y = self._subsample(X, y)
  
          # Normalize instances
          if self.normalize is not None:
              X = self.NORMALIZERS[self.normalize].fit_transform(X)
  
          # the super method calls draw and returns self
          return super(ParallelCoordinates, self).fit(X, y, **kwargs)