Aquí hay dos maneras de hacerlo. Una creando tu propio colormap
, y otra usando un masked array
. Digamos que tenemos:
import matplotlib
from pylab import *
data = np.arange(-50, 50).reshape(10, 10)
data = np.abs(data)
pcolor(data, cmap=cm.YlOrRd)
show()
Esto produce: Ahora hacemos lo mismo, pero crear una lista llamada colors
que tiene los mismos valores que cm.YlOrRd
, aparte de la entrada 0
, lo que nos propusimos a negro (0,0,0
en rgb). Luego usamos LinearSegmentedColormap.from_list
para hacer realidad el mapa de colores:
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()
Esto produce la misma trama, pero los valores cero son negro:
Aquí es a la inversa utilizando matrices enmascarados, es un poco más complicado, comentarios en el código explican los pasos:
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()
Esto produce la misma parcela que inmediatamente superior.
Existe una diferencia de potencial entre estos métodos, el primer método redondeará los valores de datos y aplicará el color apropiado, mientras que el segundo método solo establecerá valores de 0 a negro (es decir, 0.001 no se enmascarará, será el color apropiado cm.YlOrRd
). La principal ventaja de la segunda es que puedes enmascarar las entradas de manera totalmente arbitraria.