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
          """
          super(DataVisualizer, self).fit(X, y, **kwargs)
  
          # Store the classes for the legend if they're None.
          if self.classes_ is None:
              # TODO: Is this the most efficient method?
              self.classes_ = [str(label) for label in np.unique(y)]
  
          # Draw the instances
          self.draw(X, y, **kwargs)
  
          # Fit always returns self.
          return self