Python色彩映射,零值映射到黑色
我有一个正方形的数组,这些元素对应于晶格点。其中一些元素是零,其余的值在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_bad
和set_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)