【问题标题】:Discretised color map with transparency in MatplotlibMatplotlib 中具有透明度的离散化颜色图
【发布时间】:2013-11-10 13:05:21
【问题描述】:

我希望在另一个颜色网格之上绘制一个 matplotlib 颜色网格。底部图只是灰度图。

然而,当传递的数组的值为 0 时,位于顶部的那个应该绘制一个透明的正方形,并且在传递的数组中为每个其他数字绘制不同的颜色。这些是 2d numpy 数组。

目前我有:

plt.pcolormesh(array1, vmin = -32, vmax = 32, cmap = plt.cm.binary)
plt.pcolormesh(array2, cmap = plt.cm.spectral)

显然这不会产生我正在寻找的东西,我认为这样做的方法是生成我自己的颜色图,我已经阅读了本指南:http://wiki.scipy.org/Cookbook/Matplotlib/ColormapTransformations 但这似乎并没有解决透明度问题,也不知道如何将特定的值映射到特定的颜色。

作为我想要的一个简短示例,一个数组:

[[0, 1]
 [2, 3]]

应该生成一个看起来像这样的网格:

[[transparent, red
 [green, yellow]]

我该怎么做呢?将数组合并在一起不是一种选择,因为底部数据集是一个高度图,它的值很可能总是跨越第二个数组的值(这些是代理 ID)。

【问题讨论】:

    标签: python arrays numpy matplotlib color-mapping


    【解决方案1】:

    此代码应该执行类似于您需要的操作:

    使用 masked_array 编辑:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    import matplotlib.colors as colors
    import numpy.ma as ma
    
    #See http://stackoverflow.com/questions/18926031/how-to-extract-a-subset-of-a-colormap-as-a-new-colormap-in-matplotlib
    def truncate_colormap(cmap, minval=0.0, maxval=1.0, n=100):
        new_cmap = colors.LinearSegmentedColormap.from_list(
            'trunc({n},{a:.2f},{b:.2f})'.format(n=cmap.name, a=minval, b=maxval),
            cmap(np.linspace(minval, maxval, n)))
        return new_cmap
    
    #truncate the colourmap
    n_colours = 4
    new_cmap = truncate_colormap(cm.get_cmap('spectral_r'), 0, 0.4, n=n_colours)
    
    #discretise the colourmap
    bounds = np.linspace(0,n_colors,n_colours+1)
    norm = colors.BoundaryNorm(bounds, new_cmap.N)
    
    #build array one
    array1 = np.random.rand(10,10)
    
    #build array two
    array2 = np.random.randint(0,5,100).reshape(10,10)
    
    #mask the array
    array2 = ma.masked_array(array2, array2==0)
    
    #plot it
    plt.pcolormesh(array1,cmap = plt.cm.binary)
    plt.pcolormesh(array2,cmap = new_cmap, norm=norm)
    cbar = plt.colorbar()
    plt.show()
    

    这是使用掩码数组的新输出:

    【讨论】:

    • 这很好,接近我的想法,但不完全是这样。是否可以仅将 alpha 通道应用于那些 0 值?如果没有,我想我可能需要研究一种不同的方式来绘制这些数据。
    • 是的,使用掩码数组可以做到这一点。编辑我的帖子进行演示。
    • 添加了一个 n_colours 变量,以便您可以更改它。为了增加颜色之间的可区分性,增加 truncate_colormap 的 maxval 参数
    • 这太复杂了,只需使用set_under() 查看stackoverflow.com/questions/16400241/… 并将kwarg alpha=0 添加到set_under 调用中
    • stackoverflow.com/questions/19326526/… 有更完整的示例集
    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多