可能重复:
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到黑色的所有值?
谢谢, 戴夫。
答案 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()
这会产生:
现在我们做同样的事情,但创建一个名为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
颜色。第二个的主要优点是你可以完全任意地屏蔽条目。