在颜色图和颜色条中为两个(或更多)特定值添加单独的颜色

时间:2012-05-05 23:12:55

标签: python numpy matplotlib

我想在彩色图中显示矩阵,并为两个或更多特殊值赋予特定颜色。

import numpy as np
from pylab import *

np.random.seed(10)    
a=np.random.randint(-1,10, size=(5, 5))
print a

fig, ax = plt.subplots()
mat=ax.matshow(a, cmap=cm.jet, vmin=1, vmax=10)
colorbar(mat)
show()

以下是a矩阵的值:

[[ 8  3 -1  0  8]
 [-1  0  9  7  8]
 [-1  9  7  5  3]
 [ 2 -1  3  5  7]
 [ 9  0  7  3  0]]

这是情节: enter image description here
我想为所有-1个条目分配黑色,为所有0个条目分配白色,我希望它在第一个下面的颜色条上显示为两个离散颜色。这是一个例子,我的照片编辑技巧很差,但应该清楚我想要的东西(颜色条应该是比例尺):
enter image description here 有一个连续的jet彩色地图对我来说并不重要,我会满意的解决方案,我的颜色条将是离散的,并由例如10种颜色组成,其中两种颜色为黑色和白色,8来自jet彩色地图颜色。然而,重要的是-1和0具有不同的颜色,无论总的值范围是多少 例如,如果值范围是-1到1000:
enter image description here

2 个答案:

答案 0 :(得分:8)

您可以使用ListedColormap:

import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt

N = 10

np.random.seed(10)    
a=np.random.randint(-1, N, size=(5, 5))
print a

fig, ax = plt.subplots()

colors = [(0.0,0.0,0.0),(1.0,1.0,1.0)]
colors.extend(mpl.cm.jet(np.linspace(0, 1, N-1)))
cmap = mpl.colors.ListedColormap(colors)
mat=ax.matshow(a, cmap=cmap, vmin=-1, vmax=N-1)
cax = plt.colorbar(mat, ticks=np.linspace(-0.5, N-1-0.5, N+1))
cax.set_ticklabels(range(-1, N))
plt.show()

enter image description here

对于值范围,您可以先将值转换为范围索引。

答案 1 :(得分:0)

回应@ newPyUser的评论......

认为 @ HYRY的魔法以这种方式发生......

由2个RGB元素组成的列表,即黑色(颜色[0])和白色(颜色[1]) colors = [(0.0,0.0,0.0),(1.0,1.0,1.0)] 然后将剩余的色彩空间附加到2项目列表的末尾,即从0到N-1的值,步长为1 colors.extend(mpl.cm.jet(np.linspace(0, 1, N-1))) 最后构建从-1到N-1定义的cmap cmap = mpl.colors.ListedColormap(colors) mat=ax.matshow(a, cmap=cmap, vmin=-1, vmax=N-1) 那样-1被映射到黑色(colors [0]),0被映射到白色(colors [1])