我正在尝试创建一个由4种不同颜色组成的颜色图。我有一个NumPy数组,其中包含4个值:0、.25、.75和1。如何让MatPlotLib绘制,例如,绿色表示0,蓝色表示.25,黄色表示.75,红色表示1?
谢谢!
谢谢!
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()
来自用户2660966的答案让我找到了正确的方向,但实际上你可以将事情变得更加简单。这就是我最终得出的结果:
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)
如果您尝试构建非连续色彩地图,则行为可能有点奇怪,但大多数地图都是连续的,因此对我来说从未成为问题。
尝试使用ListedColormap
和BoundaryNorm
。请参考http://matplotlib.sourceforge.net/examples/api/colorbar_only.html中的示例。
有几种不同的方法可以做到这一点。以下是我过去使用过的其中一种:
def color(value, data):
c=colorsys.hsv_to_rgb(value / data.max() / (1.1), 1, 1)<br>
return c[::-1]
如果您传递一个值数组和指向它的数据点,它应该返回一种颜色,其范围从蓝色到红色,基于它在传递的数组中排名与最大值相关。请参见此处的示例代码:
http://www.scipy.org/Cookbook/Matplotlib/ColormapTransformations