Combining two matplotlib colormaps

前端 未结 1 863
花落未央
花落未央 2020-12-06 01:56

I would like to merge two colormaps into one, such that I can use one cmap for negative values and the other one for positive values.

At the moment I do

相关标签:
1条回答
  • 2020-12-06 02:21

    Colormaps are basically just interpolation functions which you can call. They map values from the interval [0,1] to colors. So you can just sample colors from both maps and then combine them:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.colors as mcolors
    
    data = np.random.rand(10,10) * 2 - 1
    
    # sample the colormaps that you want to use. Use 128 from each so we get 256
    # colors in total
    colors1 = plt.cm.binary(np.linspace(0., 1, 128))
    colors2 = plt.cm.gist_heat_r(np.linspace(0, 1, 128))
    
    # combine them and build a new colormap
    colors = np.vstack((colors1, colors2))
    mymap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors)
    
    plt.pcolor(data, cmap=mymap)
    plt.colorbar()
    plt.show()
    

    Result: enter image description here

    NOTE: I understand that you might have specific needs for this, but in my opinion this is not a good approach: How will you distinguish -0.1 from 0.9? -0.9 from 0.1?

    One way to prevent this is to sample the maps only from ~0.2 to ~0.8 (e.g.: colors1 = plt.cm.binary(np.linspace(0.2, 0.8, 128))) so they wont go all the way up to black:

    enter image description here

    0 讨论(0)
提交回复
热议问题