2

我正在寻找在另一个颜色网格之上绘制一个 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)。

4

1 回答 1

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()

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

在此处输入图像描述

于 2013-11-10T13:55:53.183 回答