2012-03-14 11 views
35

Tengo una imagen simple que estoy mostrando con imshow en matplotlib. Me gustaría aplicar un mapa de colores personalizado para que los valores entre 0-5 sean blancos, 5-10 sean rojos (colores muy simples), etc. He intentado seguir este tutorial:Definición de un mapa de colores discreto para imshow en matplotlib

http://assorted-experience.blogspot.com/2007/07/custom-colormaps.html con el siguiente código:

cdict = { 
'red' : ((0., 0., 0.), (0.5, 0.25, 0.25), (1., 1., 1.)), 
'green': ((0., 1., 1.), (0.7, 0.0, 0.5), (1., 1., 1.)), 
'blue' : ((0., 1., 1.), (0.5, 0.0, 0.0), (1., 1., 1.)) 
} 

my_cmap = mpl.colors.LinearSegmentedColormap('my_colormap', cdict, 3) 

plt.imshow(num_stars, extent=(min(x), max(x), min(y), max(y)), cmap=my_cmap) 
plt.show() 

Pero esto termina mostrando colores extraños, y solo necesito 3-4 colores que quiero definir. ¿Cómo hago esto?

+0

Pregunta similar: http://stackoverflow.com/questions/9451545/using-matplotlib-to-draw-color-bar-with-distinguishable-and-uncontinues-colors/9451776#9451776 –

Respuesta

64

Se puede utilizar un ListedColormap para especificar el blanco y el rojo como los únicos colores en el mapa de color, y los límites determinar dónde la transición es de un color a la siguiente:

import matplotlib.pyplot as plt 
from matplotlib import colors 
import numpy as np 

np.random.seed(101) 
zvals = np.random.rand(100, 100) * 10 

# make a color map of fixed colors 
cmap = colors.ListedColormap(['white', 'red']) 
bounds=[0,5,10] 
norm = colors.BoundaryNorm(bounds, cmap.N) 

# tell imshow about color map so that only set colors are used 
img = plt.imshow(zvals, interpolation='nearest', origin='lower', 
        cmap=cmap, norm=norm) 

# make a color bar 
plt.colorbar(img, cmap=cmap, norm=norm, boundaries=bounds, ticks=[0, 5, 10]) 

plt.savefig('redwhite.png') 
plt.show() 

La cifra resultante tiene sólo dos colores:

enter image description here

que proponen esencialmente la misma cosa para una pregunta un tanto diferente: 2D grid data visualization in Python

La solución está inspirada en un matplotlib example. El ejemplo explica que el bounds debe ser uno más que el número de colores utilizados.

BoundaryNorm es una normalización que asigna una serie de valores a enteros, que luego se utilizan para asignar los colores correspondientes. cmap.N, en el ejemplo anterior, solo define el número de colores.

Cuestiones relacionadas