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]]

这是情节: 在此处输入图像描述
我想将黑色分配给所有 -1 条目,将白色分配给所有 0 条目,并且我希望它以两种离散颜色显示在第一号下方的颜色条上。这是一个例子,我的照片编辑能力很差,但应该清楚我想要什么(颜色条应该是按比例的):
在此处输入图像描述 拥有连续的jet颜色图对我来说并不重要,我会满足于一个解决方案我的颜色条将是离散的,例如由 10 种颜色组成,其中两种是黑色和白色,8 种来自jet彩色地图颜色。但是,重要的是 -1 和 0 具有不同的颜色,无论值的总范围是多少。
例如,如果值范围是从 -1 到 1000:
在此处输入图像描述

4

2 回答 2

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()

在此处输入图像描述

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

于 2012-05-06T02:03:54.980 回答
0

回应@newPyUser 的评论...

认为@HYRY 的魔法就是这样发生的……

由 2 个 RGB 元素组成的列表,即黑色 (colors[0]) 和白色 (colors[1]) colors = [(0.0,0.0,0.0),(1.0,1.0,1.0)] 然后将颜色空间的其余部分附加到 2 项列表的末尾,即从 0 到 N- 的值1 at step of 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 被映射到黑色(颜色 [0]),0 被映射到白色(颜色 [1])

于 2016-07-04T18:46:56.703 回答