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

use*_*075 6 python matplotlib

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

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

目前我正在使用,因为我的numpy数值'x'.

pcolor(x,cmap=cm.YlOrRd)
Run Code Online (Sandbox Code Playgroud)

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

谢谢,戴夫.

fra*_*xel 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()
Run Code Online (Sandbox Code Playgroud)

这会产生: 在此输入图像描述 现在我们做同样的事情,而是创建一个名为列表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()
Run Code Online (Sandbox Code Playgroud)

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

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

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()
Run Code Online (Sandbox Code Playgroud)

这产生了与上面相同的图.

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