2012-05-05 108 views
4

我想在颜色图中显示矩阵,并给出两个或多个特殊值的特定颜色。为颜色图和颜色条中的两个(或多个)特定值添加单独的颜色

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

回答

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

这个代码会更有用,如果它里面有任何注释或解释,码。这对我们这些没有太多经验的人有帮助。谢谢 – codeKiller

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))) 步骤最后构建CMAP定义从-1到N-1 cmap = mpl.colors.ListedColormap(colors) mat=ax.matshow(a, cmap=cmap, vmin=-1, vmax=N-1) 这种方式-1被映射为黑色(颜色[0])并且0被映射为白色(颜色[1])