如何创建专门处理一个值的matplotlib色彩映射?

时间:2014-08-21 17:43:16

标签: python matplotlib

如何创建matplotlib色彩映射,将0(和 0)映射到白色,将任何其他值0 < v <= 1映射到平滑渐变如rainbow

似乎LinearSegmentedColormapListedColormap都无法做到这一点。

1 个答案:

答案 0 :(得分:13)

有几种方法可以做到这一点。根据您对值范围的描述,您只想使用cmap.set_under('white'),然后将vmin设置为0 + eps

例如:

import matplotlib.pyplot as plt
import numpy as np

cmap = plt.get_cmap('rainbow')
cmap.set_under('white')  # Color for values less than vmin

data = np.random.random((10, 10))
data[3:5, 7:] = 0

# Very small float such that 0.0 != 0 + eps
eps = np.spacing(0.0)

fig, ax = plt.subplots()
im = ax.imshow(data, interpolation='nearest', vmin=eps, cmap=cmap)
fig.colorbar(im, extend='min')
plt.show()

enter image description here

但是,如果0位于数据范围的中间,您可以屏蔽这些值并使用cmap.set_bad设置颜色(我将使用黑色作为颜色来区分屏蔽部分的默认值。):

import matplotlib.pyplot as plt
import numpy as np

cmap = plt.get_cmap('rainbow')
cmap.set_bad('black')

data = np.random.normal(0, 1, (10, 10))
data[3:5, 7:] = 0

data = np.ma.masked_equal(data, 0)

fig, ax = plt.subplots()
im = ax.imshow(data, interpolation='nearest', cmap=cmap)
fig.colorbar(im)
plt.show()

enter image description here