2012-05-10 32 views
6

Duplicar posible:
Add separate colors for two (or more) specific values in color plot and color barajuste de color arbitrario en la parcela pseudocolor con matplotlib

tengo una matriz de valores y me gustaría para trazar estas usando pcolor en matplotlib. Estoy usando el mapa de colores 'YlOrRd' y funciona bien, pero me gustaría usar el mapa de colores para todos los valores que no sean cero. Es decir, todos los valores no son 0, deben usar el mapa de colores. Me gustaría que 0 sea negro.

Actualmente estoy usando, para mi numpy matriz de valores 'x'.

pcolor(x,cmap=cm.YlOrRd) 

¿Hay alguna forma de arreglar arbitrariamente todos los valores en el conjunto x que son 0 a negro?

Gracias, Dave.

Respuesta

5

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: enter image description here 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:

enter image description here 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.

Cuestiones relacionadas