2010-04-05 7 views
62

Sto cercando di usare imshow in matplotlib per tracciare i dati come heatmap, ma alcuni dei valori sono NaN. Mi piacerebbe che i NaNs fossero resi come un colore speciale non trovato nella mappa dei colori.Come posso tracciare i valori NaN come un colore speciale con imshow in matplotlib?

esempio:

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() 

L'immagine risultante è inaspettatamente tutto blu (il colore più bassa nella mappa di colori a getto). Tuttavia, se faccio il tramando come questo:

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

--quindi ottengo qualcosa di meglio, ma i valori NaN sono disegnate lo stesso colore Vmin ... c'è un modo aggraziato che posso impostare NaN a essere disegnato con un colore speciale (es .: grigio o trasparente)?

+0

Alcuni anni dopo ('matplotlib .__ versione __ == '1.2.1''), questo funziona senza problemi. –

risposta

60

Hrm, sembra che posso utilizzare un array mascherato per fare questo:

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) 

Questo dovrebbe essere sufficiente, anche se sono ancora aperti ai suggerimenti. :]

+0

Fa sicuramente il trucco. I documenti ufficiali non mostrano altro. – Agos

+5

Un punto laterale - Penso che fare ciò sovrascriverà il 'matplotlib.cm.jet' di default, quindi di solito faccio una copia:' import copy; CMAP = copy.copy (matplotlib.cm.jet) '. Inoltre, se vuoi impostare valori 0 su un colore diverso, qualcosa come 'cmap._init(); cm._lut [:, 0] = (1,1,1,1) 'dovrebbe funzionare. – keflavich

+2

Vi sono anche 'set_over' e' set_under' per controllare la colorazione dei valori fuori intervallo. Il comportamento predefinito corrisponde alla parte superiore/inferiore dell'intervallo di colori. – tacaswell

3

Non ha funzionato per me. Mi stavo messaggio di errore, così ha fatto soluzione:

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

sarebbe probabilmente utile se hai postato quale errore stavi ricevendo. –

7

Con le nuove versioni di Matplotlib, non è necessario utilizzare una matrice più mascherato.

Ad esempio, supponiamo generare un array in cui ogni valore 7 è un NaN:

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

Possiamo modificare la colormap corrente e tracciare la matrice con le seguenti linee:

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

plot result