Python Matplotlib:将渐变颜色贴图与列出的颜色贴图组合

Python Matplotlib:将渐变颜色贴图与列出的颜色贴图组合,python,matplotlib,Python,Matplotlib,我有一个数据帧,其中的值来自(0,1)(注意,这两个数字都不包括)的一些计算 然后,我用0填充了一些缺少的值 我想为热图创建以下颜色图: 如果缺少数据(=0):热图中的白色(仅一种白色) 如果数据低于阈值(例如0

我有一个数据帧,其中的值来自(0,1)(注意,这两个数字都不包括)的一些计算

然后,我用0填充了一些缺少的值

我想为热图创建以下颜色图:

  • 如果缺少数据(=0):热图中的白色(仅一种白色)
  • 如果数据低于阈值(例如0<数据<0.5):浅色(仅一种浅色)
  • 如果数据高于阈值:红色(或任何其他颜色,无所谓)的渐变色贴图
  • 他们这里的关键是,我想有确切的灰色和白色的1。二,。我不希望在treshold以下的值和阈值以上的值之间有任何渐变

    我已经看到了关于组合两个颜色贴图的问题:,但我真的不明白在代码中它在哪里将负值映射到不同的颜色贴图,或者如何使第二个颜色贴图非渐变

    仅用于示例目的的数据:

    data = np.random.rand(10,10) * 2 - 1.3
    data[data < 0] = 0
    
    它给了我什么:

    再次:我希望将热图的红色部分更改为渐变(理想情况下,颜色条不应该具有与现在相同大小的所有颜色)

    谢谢

    更新:

    我终于意识到,有可能通过
    cdict
    定义一个颜色映射来实现以下功能:

    然而,我并没有得到我所期望的

    我有这个
    cdict

    cdict = {'red':   ((0.0,  1.0, 1.0),
                       (0.0001,  1.0, 1.0),
                       (lower_bound, 0.99, 0.99),
                       (threshold, 0.99, 0.99),
                       (threshold + 0.0001, 0.98, 0.98),
                       (upper_bound,  0.57, 0.57),
                       (upper_bound + 0.0001,  0.0, 0.0),
                       (1.0, 0.0, 0.0)),
    
             'green': ((0.0,  1.0, 1.0),
                       (0.0001, 1.0, 1.0),
                       (lower_bound, 0.92, 0.92),
                       (threshold, 0.92, 0.92),
                       (threshold + 0.0001, 0.63, 0.63),
                       (upper_bound,  0.0, 0.0),
                       (upper_bound + 0.0001,  0.0, 0.0),
                       (1.0, 0.0, 0.0)),
    
             'blue':  ((0.0,  1.0, 1.0),
                       (0.0001,  1.0, 1.0),
                       (lower_bound, 0.82, 0.82),
                       (threshold, 0.82, 0.82),
                       (threshold + 0.0001, 0.42, 0.42),
                       (upper_bound, 0.0, 0.0),
                       (upper_bound + 0.0001,  0.0, 0.0),
                       (1.0, 0.0, 0.0))
            }
    cmap = LinearSegmentedColormap('cdict', cdict)
    
    界限:

    lower_bound = data[data != 0].min()
    upped_bound = data.max()
    threshold = 0.2
    
    其中对于我来说
    (下限、上限、阈值)
    =
    (0.02249988938707692,0.6575927961263812,0.2)

    绘图:

    然而,我明白了:


    怎么可能呢?如果根据我对
    cdict
    的理解,黑色只分配给高于
    上限的值,为什么我会有这么多黑色方块呢?这是没有意义的,因为
    上限
    是所有数组中的最大值…

    您希望白色从0到阈值,以及从阈值到1的渐变。当您的数据也在0到1之间时,这非常容易。可通过
    下的
    .set\u设置0以下值的颜色

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.colors import LinearSegmentedColormap
    
    
    data = np.random.rand(10,10) * 2 - 1.3
    
    thresh = 0.2
    nodes = [0,thresh, thresh, 1.0]
    colors = ["white", "white", "red", "indigo"]
    cmap = LinearSegmentedColormap.from_list("", list(zip(nodes, colors)))
    cmap.set_under("gray")
    
    fig, ax = plt.subplots()
    im = ax.imshow(data, cmap=cmap, vmin=0, vmax=1)
    fig.colorbar(im, extend="min")
    plt.show()
    

    @Ardweaden根据其他问题的答案改进了一些东西,但问题仍然没有解决。我认为您的cdict设置不正确。你能试试我在答案里贴的那个吗(贴在那里是为了方便)?@Ardweaden我试过了,但那不是我所期望的。颜色条应为以下颜色:0周围为白色,亮度为0.2,渐变为0.2至末端。你给出的:0左右为黑色,1.5左右为渐变,之后为白色。你能发布你得到的图像或你的数据吗?那将非常有帮助。
    fig, ax = plt.subplots(figsize = (15, 6))
    im = ax.imshow(data, cmap = cmap)
    cbar = ax.figure.colorbar(im, ax = ax)
    
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.colors import LinearSegmentedColormap
    
    
    data = np.random.rand(10,10) * 2 - 1.3
    
    thresh = 0.2
    nodes = [0,thresh, thresh, 1.0]
    colors = ["white", "white", "red", "indigo"]
    cmap = LinearSegmentedColormap.from_list("", list(zip(nodes, colors)))
    cmap.set_under("gray")
    
    fig, ax = plt.subplots()
    im = ax.imshow(data, cmap=cmap, vmin=0, vmax=1)
    fig.colorbar(im, extend="min")
    plt.show()