使用matplotlib在伪彩色图中设置任意颜色

时间:2012-05-10 06:30:38

标签: python matplotlib

  

可能重复:
  Add separate colors for two (or more) specific values in color plot and color bar

我有一系列值,我想在matplotlib中使用pcolor绘制这些值。我正在使用颜色贴图'YlOrRd'并且它工作正常 - 但我想将颜色贴图用于除零之外的所有值。也就是说,所有值都不是0,应该使用颜色图 - 我希望0为黑色。

目前我正在使用,因为我的numpy数组'x'。

pcolor(x,cmap=cm.YlOrRd)

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

谢谢, 戴夫。

1 个答案:

答案 0 :(得分: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()

这会产生: enter image description here 现在我们做同样的事情,但创建一个名为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()

这会生成相同的图,但零值为黑色:

enter image description here 这是使用掩码数组的另一种方式,它涉及更多,代码中的注释解释了步骤:

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颜色。第二个的主要优点是你可以完全任意地屏蔽条目。