Search code examples
pythonmatplotlibparallel-coordinates

Removing legend from mpl parallel coordinates plot?


I have a parallel coordinates plot with lots of data points so I'm trying to use a continuous colour bar to represent that, which I think I have worked out. However, I haven't been able to remove the default key that is put in when creating the plot, which is very long and hinders readability. Is there a way to remove this table to make the graph much easier to read?

This is the code I'm currently using to generate the parallel coordinates plot:

parallel_coordinates(data[[' male_le',' 
female_le','diet','activity','obese_perc','median_income']],'median_income',colormap = 'rainbow', 
alpha = 0.5)

fig, ax = plt.subplots(figsize=(6, 1))
fig.subplots_adjust(bottom=0.5)

cmap = mpl.cm.rainbow
bounds = [0.00,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]
norm = mpl.colors.BoundaryNorm(bounds, cmap.N,)
plt.colorbar(mpl.cm.ScalarMappable(norm = norm, cmap=cmap),cax = ax, orientation = 'horizontal', 
label = 'normalised median income', alpha = 0.5)

plt.show()

Current Output:

Plot is difficult read with current legend

I want my legend to be represented as a color bar, like this:

The color bar I want as my 'legend', which can just go underneath

Any help would be greatly appreciated. Thanks.


Solution

  • You can use ax.legend_.remove() to remove the legend.

    The cax parameter of plt.colorbar indicates the subplot where to put the colorbar. If you leave it out, matplotlib will create a new subplot, "stealing" space from the current subplot (subplots are often referenced to by ax in matplotlib). So, here leaving out cax (adding ax=ax isn't necessary, as here ax is the current subplot) will create the desired colorbar.

    The code below uses seaborn's penguin dataset to create a standalone example.

    import matplotlib.pyplot as plt
    import matplotlib as mpl
    import seaborn as sns
    import numpy as np
    from pandas.plotting import parallel_coordinates
    
    penguins = sns.load_dataset('penguins')
    
    fig, ax = plt.subplots(figsize=(10, 4))
    cmap = plt.get_cmap('rainbow')
    bounds = np.arange(penguins['body_mass_g'].min(), penguins['body_mass_g'].max() + 200, 200)
    norm = mpl.colors.BoundaryNorm(bounds, 256)
    
    penguins = penguins.dropna(subset=['body_mass_g'])
    parallel_coordinates(penguins[['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']],
                         'body_mass_g', colormap=cmap, alpha=0.5, ax=ax)
    ax.legend_.remove()
    plt.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmap),
                 ax=ax, orientation='horizontal', label='body mass', alpha=0.5)
    plt.show()
    

    parallel_coordinates without legend