Obteniendo colores individuales de un mapa de color en matplotlib

Si tienes un mapa de colores de

cmap = matplotlib.cm.get_cmap('Spectral') 

¿Cómo puedes obtener un color particular de entre 0 y 1, donde 0.0 es el primer color en el mapa y 1.0 es el último color en el mapa?

Lo ideal sería poder obtener el color medio en el mapa haciendo:

 >>> do_some_magic(cmap, 0.5) # Return an RGBA tuplet (0.1, 0.2, 0.3, 1.0) 

Puede hacer esto con el código a continuación, y el código en su pregunta fue realmente muy cercano a lo que necesitaba, todo lo que tiene que hacer es llamar al objeto cmap que tiene.

 import matplotlib cmap = matplotlib.cm.get_cmap('Spectral') rgba = cmap(0.5) print(rgba) # (0.99807766255210428, 0.99923106502084169, 0.74602077638401709, 1.0) 

Para valores fuera del rango [0.0, 1.0] devolverá el color inferior y superior (respectivamente). Esto, por defecto, es el color mínimo y máximo dentro del rango (0.0 y 1.0). Este valor predeterminado se puede cambiar con cmap.set_under() y cmap_set_over() .

Para números “especiales” como np.nan y np.inf el valor predeterminado es usar el valor 0.0, esto se puede cambiar usando cmap.set_bad() manera similar a debajo y más arriba que arriba.

Finalmente, puede ser necesario que normalice sus datos de modo que se ajusten al rango [0.0, 1.0] . Esto se puede hacer usando matplotlib.colors.Normalize simplemente como se muestra en el pequeño ejemplo a continuación, donde los argumentos vmin y vmax describen qué números deben asignarse a 0.0 y 1.0 respectivamente.

 import matplotlib norm = matplotlib.colors.Normalize(vmin=10.0, vmax=20.0) print(norm(15.0)) # 0.5 

Un normalizador logarítmico ( matplotlib.colors.LogNorm ) también está disponible para rangos de datos con un amplio rango de valores.

(Gracias a Joe Kington y tcaswell por las sugerencias sobre cómo mejorar la respuesta).

Para obtener un valor entero rgba en lugar de un valor flotante, podemos hacer

 rgba = cmap(0.5,bytes=True) 

Entonces, para simplificar el código basado en la respuesta de Ffisegydd, el código sería así:

 #import colormap from matplotlib import cm #normalize item number values to colormap norm = matplotlib.colors.Normalize(vmin=0, vmax=1000) #colormap possible values = viridis, jet, spectral rgba_color = cm.jet(norm(400),bytes=True) #400 is one of value between 0 and 1000