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)
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