Python色彩映射,零值映射到黑色

15 投票
1 回答
31983 浏览
提问于 2025-04-17 23:13

我有一个正方形的数组,这些元素对应于晶格点。其中一些元素是零,其余的值在1到大约2700之间。我想使用imshow和OrRd颜色映射,让所有大于0的晶格点显示相应的颜色,但重要的是,所有值为0的点要显示为黑色。我试着定义了一个新的颜色映射,像这样:

colors = [(0,0,0)] + [(pylab.cm.OrRd(i)) for i in range(1,256)] 
new_map = matplotlib.colors.LinearSegmentedColormap.from_list('new_map', colors, N=256)

但是我数组中的值范围太大,导致很多非零的值也显示成黑色。

非常感谢。

1 个回答

35

Matplotlib的颜色映射有两个属性,分别是set_badset_under,可以用来处理一些特殊情况。这个例子展示了如何使用set_bad

import matplotlib.pyplot as plt
import numpy as np

# make some data
a = np.random.randn(10,10)

# mask some 'bad' data, in your case you would have: data == 0
a = np.ma.masked_where(a < 0.05, a)

# cmap = plt.cm.OrRd

# for mpl 3.3 and higher use
cmap = mpl.cm.get_cmap("OrRd").copy()

cmap.set_bad(color='black')

im = plt.imshow(a, interpolation='none', cmap=cmap)

在这里输入图片描述

如果你想使用set_under,需要在绘图命令中添加vmin这个参数,并且设置的值要稍微大于零(但要小于其他任何有效值):

cmap.set_under(color='black')    
im = plt.imshow(a, interpolation='none', cmap=cmap, vmin=0.0000001)

撰写回答