matplotlib中基质的定制着色

时间:2015-04-25 19:03:13

标签: python matrix matplotlib plot colormap

我有三个矩阵我想绘制,但我想出的唯一解决方案就是一个接一个地绘制,这样就留下了最后一个矩阵。

ax.imshow(mat1, cmap='Blues', interpolation='nearest')
ax.imshow(mat2, cmap='binary', interpolation='nearest')
ax.imshow(mat3, cmap='autumn', interpolation='nearest')  # actual plot

我想要的是以白色显示三个矩阵中的所有0,并根据矩阵显示不同色调中的更高值,例如:蓝色,黑色和红色。此外,在该示例中,红色单元优先于黑色,黑色优先于蓝色。我想到的解决方案是一个函数,给定一个三元组(蓝色,黑色,红色)和每个组件的不同值,返回单元格应该着色的颜色,并将其提供给ColorMap,但我真的不知道该怎么做或者甚至可能。

欢迎并赞赏各种帮助甚至不同的解决方案(最有可能发生的)。提前谢谢。

1 个答案:

答案 0 :(得分:3)

你想要一个第四个图像,每个点的RGB值是对应点前三个矩阵的单个值的函数吗?如果是这样,你能否产生代数从三个值到RGB第四个?

您的问题表明关于绘图如何将数据转换为颜色的混淆。色图采用单值数据,对其进行标准化,并将其映射到一些命名的颜色数组中。 0值可能会映射到任何颜色,具体取决于色彩映射和其他数据。

位图定义每个像素的(红色,绿色,蓝色)值。正确的位图具有标题部分,但数据是(m,n,3)数组。 imshow只绘制该数组;它期望RGB值在[0,1]范围内。

如果您有三个数据矩阵,则必须选择如何将值映射到RGB值。这是一个有三种RGB映射的例子。前两行是具有一系列值的虚拟数据,用色标图或最简单的RGB表示法显示。最后一行显示了使用整个颜色空间将所有三个虚拟矩阵组合成一个图像的方法。

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np

#dummy data
x = 8
y = 15
mat = []
mat.append(np.arange(x * y).reshape((x, y)) / float(x * y) )
mat.append(np.arange(x * y).reshape((y, x)).T / float(x* y))
mat.append(np.arange(y) * np.arange(x)[:,np.newaxis] / float(99))

# NOTE: this data is approximately in the RGB range. If yours isn't, normalize,
# here or in your makeRGB function.
# (The colormap normalizes single-valued data).

fig, axs = plt.subplots(figsize=(7,4), nrows=3, ncols=3,
                        gridspec_kw={'hspace':0.6})

axs[0,0].imshow(mat[0], cmap='Reds', interpolation='nearest')
axs[0,1].imshow(mat[1], cmap='Greens', interpolation='nearest')
axs[0,2].imshow(mat[2], cmap='Blues', interpolation='nearest')
axs[0,0].set_xlabel('Reds Colormap')
axs[0,1].set_xlabel('Greens Colormap')
axs[0,2].set_xlabel('Blues Colormap')

def asOneHue(mat, hue):
    """
    Use a single-valued matrix to represent one hue in a RGB file.'
    """
    RGBout = np.zeros((len(mat),len(mat[0]),3))
    RGBout[:,:,i] = mat
    return RGBout

for i in (0,1,2):
    axs[1,i].imshow(asOneHue(mat[i],i))
axs[1,0].set_xlabel('Reds bitmap')
axs[1,1].set_xlabel('Greens bitmap')
axs[1,2].set_xlabel('Blues bitmap')

# different ways to combine 3 values
def makeRGB0(mats):
    RGBout = np.zeros((len(mats[0]),len(mats[0][0]),3))
    #RGBout = np.ones((len(mats[0]),len(mats[0][0]),3))
    for i in (0,1,2):
        RGBout[:,:,i] = mats[i]
    return RGBout

axs[2,0].imshow(makeRGB0(mat))
axs[2,0].set_xlabel('Color layers')

def makeRGB1(mats):
    RGBout = np.zeros((len(mats[0]),len(mats[0][0]),3))
    i,j,k = RGBout.shape

    for x in range(i):
        for y in range(j):
            RGBout[x,y] = (mats[0][x][y] / 2,
                           mats[1][x][y],
                           1 - mats[2][x][y])
    return RGBout


axs[2,1].imshow(makeRGB1(mat))
axs[2,1].set_xlabel('Algebraic')

def makeRGB2(mats):
    RGBout = np.zeros((len(mats[0]),len(mats[0][0]),3))
    i,j,k = RGBout.shape
    for x in range(i):
        for y in range(j):
            if mats[0][x][y] > .8:
                RGBout[x,y] = (mats[0][x][y],
                               0,
                               0)
            elif mats[1][x][y] > .8:
                    RGBout[x,y] = (0,
                                   mats[1][x][y],
                                   0)
            else:
                    RGBout[x,y] = (mats[0][x][y],
                                   mats[1][x][y],
                                   mats[2][x][y])
    return RGBout

axs[2,2].imshow(makeRGB2(mat))
axs[2,2].set_xlabel('If-else')

plt.show()

enter image description here