Come posso tracciare valori NaN come un colore speciale con imshow in matplotlib?
-
24-09-2019 - |
Domanda
Sto cercando di usare imshow in matplotlib ai dati del diagramma come heatmap, ma alcuni dei valori sono NaN. Mi piacerebbe le NaNs essere reso come un colore speciale non trovato nella mappa dei colori.
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ù basso della mappa di colori a getto). Tuttavia, se faccio il tracciato in questo modo:
ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)
- poi ho qualcosa di meglio, ma i valori NaN sono disegnate lo stesso colore Vmin ... C'è un modo aggraziato che posso impostare NaNs essere disegnati con un colore speciale (ad esempio: grigio o trasparente)?
Soluzione
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. :]
Altri suggerimenti
Con le nuove versioni di Matplotlib, non è necessario utilizzare più una matrice mascherato.
Per esempio, si generano 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
Si può modificare la mappa di colori corrente e tracciare l'array con le seguenti righe:
current_cmap = matplotlib.cm.get_cmap()
current_cmap.set_bad(color='red')
plt.imshow(arr)