2010-04-05 21 views
62

Estoy tratando de usar imshow en matplotlib para trazar los datos como un mapa de calor, pero algunos de los valores son NaN. Me gustaría que los NaN se rendericen como un color especial que no se encuentra en el mapa de colores.¿Cómo puedo trazar los valores NaN como un color especial con imshow en matplotlib?

ejemplo:

import numpy as np 
import matplotlib.pyplot as plt 
f = plt.figure() 
ax = f.add_subplot(111) 
a = np.arange(25).reshape((5,5)).astype(float) 
a[3,:] = np.nan 
ax.imshow(a, interpolation='nearest') 
f.canvas.draw() 

La imagen resultante es inesperadamente todo azul (el color más bajo en el mapa de colores de chorro). no

ax.imshow(a, interpolation='nearest', vmin=0, vmax=24) 

--¡entonces me sale algo mejor, pero los valores NaN se dibujan del mismo color que Vmin ... es una forma elegante que puedo fijar a NaNs: Sin embargo, si hago el trazado como esto dibujar con un color especial (por ejemplo: gris o transparente)?

+0

Unos años más tarde ('matplotlib .__ version __ == '1.2.1''), esto funciona sin problemas. –

Respuesta

60

Hrm, parece que puedo usar una variedad de máscaras para hacer esto:

masked_array = np.ma.array (a, mask=np.isnan(a)) 
cmap = matplotlib.cm.jet 
cmap.set_bad('white',1.) 
ax.imshow(masked_array, interpolation='nearest', cmap=cmap) 

Esto debería ser suficiente, aunque todavía estoy abierto a sugerencias. :]

+0

Definitivamente hace el truco. Los documentos oficiales no muestran nada más. – Agos

+5

Un punto de vista lateral: creo que al hacerlo se anulará el 'matplotlib.cm.jet' predeterminado, por lo que generalmente hago una copia:' import copy; cmap = copy.copy (matplotlib.cm.jet) '. Además, si desea establecer 0-values ​​a un color diferente, algo como 'cmap._init(); cm._lut [:, 0] = (1,1,1,1) 'debería funcionar. – keflavich

+2

También hay 'set_over' y' set_under' para controlar la coloración de los valores fuera de rango. El comportamiento predeterminado es hacer coincidir la parte superior/inferior del rango de color. – tacaswell

3

No funcionó para mí. Que estaba recibiendo mensajes de error, también lo hizo la solución:

a[3,:] = -999 
masked_array=np.ma.masked_where(a==-999, a) 
cmap = matplotlib.cm.jet 
cmap.set_bad('w',1.) 
ax.imshow(masked_array, interpolation='nearest', cmap=cmap) 
+3

probablemente sería útil si publicó el error que estaba recibiendo. –

7

Con las nuevas versiones de Matplotlib, no es necesario utilizar una gran variedad de máscaras más.

Por ejemplo, vamos a generar una matriz en donde cada valor séptimo es un NaN:

arr = np.arange(100, dtype=float).reshape(10, 10) 
arr[~(arr % 7).astype(bool)] = np.nan 

Podemos modificar el mapa de colores actual y la trama de la matriz con las siguientes líneas:

current_cmap = matplotlib.cm.get_cmap() 
current_cmap.set_bad(color='red') 
plt.imshow(arr) 

plot result

Cuestiones relacionadas