Search code examples
pythonmatplotlibcolormap

composing colormaps in matplotlib using elements like tab* builtin


I am trying to plot some colorful discrete data using matplotlib. With tab10-like colormaps I get nice results

enter image description here

However, I would need a combination of tab20 and tab20b parts, to have my data plotted as:

1->tab20darkblue
2->tab20lightblue
3->tab20cOrange1
4->tab20cOrange2
5->tab20cOrange3
6->tab20cOrange4

is that possible somehow?


Solution

  • You can create a ListedColormap from the colors of other colormaps.

    E.g to get the darkorange color from the tab20c colormap, use plt.cm.tab20c(4) (as this is the 5th color in that map). Note that this works only for indexed colormaps - otherwise you need to use a value between 0 and 1.

    From a list of thus obtained colors, you can create a new ListedColormap.

    import matplotlib.pyplot as plt
    import matplotlib.colors
    import numpy as np
    
    colors = [plt.cm.tab20(0),plt.cm.tab20(1),plt.cm.tab20c(4),
              plt.cm.tab20c(5),plt.cm.tab20c(6),plt.cm.tab20c(7)]
    
    cmap=matplotlib.colors.ListedColormap(colors)
    
    x = np.arange(1,7)
    
    plt.scatter(x,x,c=x, s=100, cmap=cmap, vmin=1, vmax=7)
    
    plt.show()
    

    enter image description here

    Or, to get a nice colorbar as well,

    import matplotlib.pyplot as plt
    import matplotlib.colors
    import numpy as np
    
    colors = [plt.cm.tab20(0),plt.cm.tab20(1),plt.cm.tab20c(4),
              plt.cm.tab20c(5),plt.cm.tab20c(6),plt.cm.tab20c(7)]
    
    cmap=matplotlib.colors.ListedColormap(colors)
    norm = matplotlib.colors.BoundaryNorm(np.arange(1,8)-0.5,len(colors))
    
    x = np.arange(1,7)
    
    sc = plt.scatter(x,x,c=x, s=100, cmap=cmap, norm=norm)
    plt.colorbar(sc, ticks=x)
    
    plt.show()
    

    enter image description here