在matplotlib中为imshow定义离散色图

时间:2012-03-14 18:12:21

标签: python matplotlib

我有一个简单的图像,我在matplotlib中使用imshow显示。我想应用自定义色彩映射,以便0-5之间的值为白色,5-10为红色(非常简单的颜色)等。我尝试过本教程:

http://assorted-experience.blogspot.com/2007/07/custom-colormaps.html,代码如下:

cdict = {
'red'  :  ((0., 0., 0.), (0.5, 0.25, 0.25), (1., 1., 1.)),
'green':  ((0., 1., 1.), (0.7, 0.0, 0.5), (1., 1., 1.)),
'blue' :  ((0., 1., 1.), (0.5, 0.0, 0.0), (1., 1., 1.))
}

my_cmap = mpl.colors.LinearSegmentedColormap('my_colormap', cdict, 3)

plt.imshow(num_stars, extent=(min(x), max(x), min(y), max(y)), cmap=my_cmap)
plt.show()

但这最终显示出奇怪的颜色,我只需要3-4种我想要定义的颜色。我该怎么做?

2 个答案:

答案 0 :(得分:77)

您可以使用ListedColormap指定白色和红色作为颜色映射中的唯一颜色,并且边界确定从一种颜色到下一种颜色的转换位置:

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

np.random.seed(101)
zvals = np.random.rand(100, 100) * 10

# make a color map of fixed colors
cmap = colors.ListedColormap(['white', 'red'])
bounds=[0,5,10]
norm = colors.BoundaryNorm(bounds, cmap.N)

# tell imshow about color map so that only set colors are used
img = plt.imshow(zvals, interpolation='nearest', origin='lower',
                    cmap=cmap, norm=norm)

# make a color bar
plt.colorbar(img, cmap=cmap, norm=norm, boundaries=bounds, ticks=[0, 5, 10])

plt.savefig('redwhite.png')
plt.show()

结果图只有两种颜色:

enter image description here

对于一个稍微不同的问题我提出了基本相同的东西:2D grid data visualization in Python

该解决方案的灵感来自matplotlib example。该示例解释了bounds必须比使用的颜色数多一个。

BoundaryNorm是一个规范化,它将一系列值映射到整数,然后用于分配相应的颜色。 cmap.N,在上面的示例中,只定义了颜色数。

答案 1 :(得分:1)

为什么LinearSegmentedColormap显示奇怪的颜色,我认为此链接会有所帮助。

http://matplotlib.org/examples/pylab_examples/custom_cmap.html