Plots the data in `x` on the X axis and the data in `y` on the Y axis
    in a 2d categorical heatmap, and returns the resulting Plot object.
    
    The function supports SArrays of dtypes str.

    Parameters
    ----------
    x : SArray
      The data to plot on the X axis of the categorical heatmap. 
      Must be string SArray
    y : SArray
      The data to plot on the Y axis of the categorical heatmap. 
      Must be string SArray and must be the same length as `x`.
    xlabel : str (optional)
      The text label for the X axis. Defaults to "X".
    ylabel : str (optional)
      The text label for the Y axis. Defaults to "Y".
    title : str (optional)
      The title of the plot. Defaults to LABEL_DEFAULT. If the value is
      LABEL_DEFAULT, the title will be "<xlabel> vs. <ylabel>". If the value
      is None, the title will be omitted. Otherwise, the string passed in as the
      title will be used as the plot title.

    Returns
    -------
    out : Plot
      A :class: Plot object that is the categorical heatmap.

    Examples
    --------
    Make a categorical heatmap.

    >>> x = turicreate.SArray(['1','2','3','4','5'])
    >>> y = turicreate.SArray(['a','b','c','d','e'])
    >>> catheat = turicreate.visualization.categorical_heatmap(x, y)

def categorical_heatmap(x, y, xlabel=LABEL_DEFAULT, ylabel=LABEL_DEFAULT, title=LABEL_DEFAULT):
    """
    Plots the data in `x` on the X axis and the data in `y` on the Y axis
    in a 2d categorical heatmap, and returns the resulting Plot object.
    
    The function supports SArrays of dtypes str.

    Parameters
    ----------
    x : SArray
      The data to plot on the X axis of the categorical heatmap. 
      Must be string SArray
    y : SArray
      The data to plot on the Y axis of the categorical heatmap. 
      Must be string SArray and must be the same length as `x`.
    xlabel : str (optional)
      The text label for the X axis. Defaults to "X".
    ylabel : str (optional)
      The text label for the Y axis. Defaults to "Y".
    title : str (optional)
      The title of the plot. Defaults to LABEL_DEFAULT. If the value is
      LABEL_DEFAULT, the title will be "<xlabel> vs. <ylabel>". If the value
      is None, the title will be omitted. Otherwise, the string passed in as the
      title will be used as the plot title.

    Returns
    -------
    out : Plot
      A :class: Plot object that is the categorical heatmap.

    Examples
    --------
    Make a categorical heatmap.

    >>> x = turicreate.SArray(['1','2','3','4','5'])
    >>> y = turicreate.SArray(['a','b','c','d','e'])
    >>> catheat = turicreate.visualization.categorical_heatmap(x, y)
    """
    if (not isinstance(x, tc.data_structures.sarray.SArray) or 
        not isinstance(y, tc.data_structures.sarray.SArray) or
        x.dtype != str or y.dtype != str):
        raise ValueError("turicreate.visualization.categorical_heatmap supports " + 
            "SArrays of dtype: str")
    # legit input
    title = _get_title(title)
    plt_ref = tc.extensions.plot_categorical_heatmap(x, y, 
      xlabel, ylabel, title)
    return Plot(plt_ref)