Python Matplotlib中具有透明度的离散化颜色贴图

Python Matplotlib中具有透明度的离散化颜色贴图,python,arrays,numpy,matplotlib,color-mapping,Python,Arrays,Numpy,Matplotlib,Color Mapping,我希望在另一个colormesh上绘制matplotlib colormesh。底图只是灰度图 但是,当传递的数组的值为0时,位于顶部的数组应该绘制一个透明的正方形,并且传递的数组中的每个数字的颜色都不同。这些是2d numpy阵列 目前我有: plt.pcolormesh(array1, vmin = -32, vmax = 32, cmap = plt.cm.binary) plt.pcolormesh(array2, cmap = plt.cm.spectral) 很明显,这并没有产生我

我希望在另一个colormesh上绘制matplotlib colormesh。底图只是灰度图

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

目前我有:

plt.pcolormesh(array1, vmin = -32, vmax = 32, cmap = plt.cm.binary)
plt.pcolormesh(array2, cmap = plt.cm.spectral)
很明显,这并没有产生我想要的,我假设这样做的方法是生成我自己的颜色映射,我已经阅读了本指南:但这似乎并没有解决透明度问题,也没有解决如何使特定值映射到特定颜色的问题

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

[[0, 1]
 [2, 3]]
应生成如下所示的网格:

[[transparent, red
 [green, yellow]]

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

此代码应该执行与您所需类似的操作:

使用遮罩数组进行编辑:

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()
以下是使用屏蔽数组的新输出:


这很好,与我的想法很接近,但不完全一样。是否可以仅对0的值应用alpha通道?如果没有,我想我可能需要寻找一种不同的方法来绘制这些数据。是的,使用屏蔽数组可以做到这一点。编辑我的帖子来演示。添加了一个n_颜色变量,您可以更改它。此外,为了增加颜色之间的差异性,增加maxval参数以截断颜色映射这太复杂了,只需在()下使用
set\u
请参见并将kwarg
alpha=0
添加到
callor下的
set\u,该调用具有更完整的示例集