Estoy tratando de usar imshow en matplotlib para trazar datos como un mapa de calor, pero algunos de los valores son NaN. Me gustaría que los NaN se representen como un color especial que no se encuentra en el mapa de colores.
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 toda azul (el color más bajo en el mapa de colores del jet). Sin embargo, si hago el trazado así:
ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)
- luego obtengo algo mejor, pero los valores de NaN se dibujan del mismo color que vmin ... ¿Hay alguna manera elegante de configurar los NaN para que se dibujen con un color especial (por ejemplo: gris o transparente)?
python
matplotlib
nan
Adam Fraser
fuente
fuente
matplotlib.__version__=='1.2.1'
), esto funciona sin problemas.Respuestas:
Con las versiones más recientes de Matplotlib, ya no es necesario usar una matriz enmascarada.
Por ejemplo, generemos una matriz donde cada séptimo valor 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 trazar la matriz con las siguientes líneas:
current_cmap = matplotlib.cm.get_cmap() current_cmap.set_bad(color='red') plt.imshow(arr)
fuente
arr = np.ma.array(arr, mask=(arr == 0))
.Hrm, parece que puedo usar una matriz enmascarada 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. :]
fuente
matplotlib.cm.jet
, por lo que suelen hacer una copia:import copy; cmap=copy.copy(matplotlib.cm.jet)
. Además, si desea establecer valores 0 en un color diferente, algo comocmap._init(); cm._lut[:,0] = (1,1,1,1)
debería funcionar.set_over
yset_under
para controlar la coloración de los valores fuera de rango. El comportamiento predeterminado es hacer coincidir la parte superior / inferior de la gama de colores.masked_array
necesario en absoluto? Sia
contiene valores de NaN (lo que parecemask=np.isnan(a)
), simplemente al hacerimshow
la matriza
con el mapa personalizadocmap
se mostrarán celdas de NaN con el color requerido (blanco). Así funciona para mí. ¿Existen excepciones?nan
valores y valores medianos se tracen del mismo color, por ejemplo, blanco.