Skip to main content
 首页 » 编程设计

python之在 Matplotlib 中使用透明度离散化颜色图

2025年05月04日12arxive

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

然而,当传递的数组的值为 0 时,位于顶部的那个应该绘制一个透明的正方形,并且传递的数组中的每个其他数字的颜色不同。这些是二维 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)。

请您参考如下方法:

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

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

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