如何将NumPy数组转换为MatPlotLib色彩映射?

时间:2012-07-06 15:02:13

标签: python matplotlib

我正在尝试创建4种不同颜色的颜色贴图。我有一个NumPy数组,该数组中有4个值:0,.25,。75和1.我如何制作MatPlotLib图,例如,绿色表示0,蓝色表示.25,黄色表示.75,红色为1?

谢谢!

4 个答案:

答案 0 :(得分:2)

我建议这个函数将Nx3 numpy数组转换为colormap

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors

#-----------------------------------------
def array2cmap(X):
    N = X.shape[0]

    r = np.linspace(0., 1., N+1)
    r = np.sort(np.concatenate((r, r)))[1:-1]

    rd = np.concatenate([[X[i, 0], X[i, 0]] for i in xrange(N)])
    gr = np.concatenate([[X[i, 1], X[i, 1]] for i in xrange(N)])
    bl = np.concatenate([[X[i, 2], X[i, 2]] for i in xrange(N)])

    rd = tuple([(r[i], rd[i], rd[i]) for i in xrange(2 * N)])
    gr = tuple([(r[i], gr[i], gr[i]) for i in xrange(2 * N)])
    bl = tuple([(r[i], bl[i], bl[i]) for i in xrange(2 * N)])


    cdict = {'red': rd, 'green': gr, 'blue': bl}
    return colors.LinearSegmentedColormap('my_colormap', cdict, N)
#-----------------------------------------
if __name__ == "__main__":

    #define the colormar
    X = np.array([[0., 1., 0.],  #green
                  [0., 0., 1.],  #blue
                  [1., 1., 0.],  #yellow
                  [1., 0., 0.]]) #red
    mycmap = array2cmap(X)

    values = np.random.rand(10, 10)
    plt.gca().pcolormesh(values, cmap=mycmap)

    cb = plt.cm.ScalarMappable(norm=None, cmap=mycmap)
    cb.set_array(values)
    cb.set_clim((0., 1.))
    plt.gcf().colorbar(cb)
    plt.show()

会产生: enter image description here

答案 1 :(得分:1)

使用ListedColormap尝试BoundaryNorm。有关示例,请参阅http://matplotlib.sourceforge.net/examples/api/colorbar_only.html

答案 2 :(得分:0)

有几种不同的方法可以做到这一点。这是我过去使用的一个:


def color(value, data):
    c=colorsys.hsv_to_rgb(value / data.max() / (1.1), 1, 1)
return c[::-1]

如果传递一个值数组,并且数据指向它,它应该返回一个从蓝色到红色的颜色,基于它与传递的数组的最大值相关的等级。

另见示例代码: http://www.scipy.org/Cookbook/Matplotlib/ColormapTransformations

答案 3 :(得分:0)

来自user2660966的回答让我走上正轨,但实际上你可以让事情变得更加简单。这就是我最终的结果:

import numpy as np
from matplotlib import colors

def array2cmpa(X):
    # Assuming array is Nx3, where x3 gives RGB values
    # Append 1's for the alpha channel, to make X Nx4
    X = np.c_[X,ones(len(X))]

    return colors.LinearSegmentedColormap.from_list('my_colormap', X)

如果您尝试构建非连续色彩图,行为可能有点奇怪,但大多数地图都是连续的,所以这对我来说从来都不是问题。