6

可能重复:
为颜色图和颜色栏中的两个(或更多)特定值添加单独的颜色

我有一组值,我想在 matplotlib 中使用 pcolor 绘制这些值。我正在使用颜色图“YlOrRd”,它工作正常 - 但我想将颜色图用于除零以外的所有值。也就是说,所有不为 0 的值都应使用颜色图 - 我希望 0 为黑色。

目前我正在使用我的 numpy 值数组“x”。

pcolor(x,cmap=cm.YlOrRd)

有没有办法任意修复数组 x 中从 0 到黑色的所有值?

谢谢,戴夫。

4

1 回答 1

5

这里有两种方法。一种是创建您自己的colormap,另一种是使用masked array. 假设我们有:

import matplotlib
from pylab import *

data = np.arange(-50, 50).reshape(10, 10)
data = np.abs(data)
pcolor(data, cmap=cm.YlOrRd)
show()

这将产生: 在此处输入图像描述 现在我们做同样的事情,但是创建一个名为的列表colors,它具有与 相同的值cm.YlOrRd,除了0我们设置为黑色(0,0,0在 rgb 中)的条目。然后我们LinearSegmentedColormap.from_list用来实际制作颜色图:

import matplotlib
from pylab import *

data = np.arange(-50, 50).reshape(10, 10)
data = np.abs(data)
colors = [(0,0,0)] + [(cm.YlOrRd(i)) for i in xrange(1,256)]
new_map = matplotlib.colors.LinearSegmentedColormap.from_list('new_map', colors, N=256)
pcolor(data, cmap=new_map)
savefig('map.png')
show()

这会产生相同的图,但零值是黑色的:

在此处输入图像描述 这是使用掩码数组的另一种方法,它涉及更多,代码中的注释解释了这些步骤:

from pylab import *
import numpy.ma as ma

data=np.arange(-50,50).reshape(10,10)
data=np.abs(data)
#create a mask where only values=0 are true:
mask = data == 0
#create a masked array by combining our mask and data:
mx = ma.masked_array(data, mask)
#set masked values in cm.YlOrRd to 'black'
cm.YlOrRd.set_bad(color='black', alpha=None)
# pcolor(data,cmap=cm.YlOrRd)
#we must use pcolormesh instead of pcolor, as pcolor does not draw masked values at all
pcolormesh(mx,cmap=cm.YlOrRd)
show()

这会产生与上面相同的图。

这些方法之间存在潜在差异,第一种方法将舍入数据值并应用适当的颜色,而第二种方法只会将等于 0 的值设置为黑色(即不会屏蔽 0.001,因此将是适当的)cm.YlOrRd颜色)。第二个的主要优点是您可以完全任意屏蔽条目。

于 2012-05-10T10:04:34.070 回答