Comment puis-je tracer des valeurs NaN comme une couleur spéciale avec imshow en matplotlib?
-
24-09-2019 - |
Question
Je suis en train d'utiliser imshow dans matplotlib pour tracer des données comme heatmap, mais certaines valeurs sont NaN. Je voudrais les NaN à restituer sous forme d'une couleur spéciale ne trouve pas dans la palette de couleurs.
exemple:
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'image résultante est de façon inattendue tous bleu (couleur la plus faible dans le jet palette de couleurs). Cependant, si je fais le tracé comme celui-ci:
ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)
- alors je reçois quelque chose de mieux, mais les valeurs NaN sont attirés par la même couleur que Vmin ... Y at-il une manière gracieuse que je peux mettre NaN à tirer avec une couleur particulière (par exemple: gris ou transparent)?
La solution
Hmm, il semble que je peux utiliser un tableau masqué pour faire ceci:
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)
Cela devrait suffire, mais je suis toujours ouvert aux suggestions. :]
Autres conseils
Avec les nouvelles versions de Matplotlib, il est pas nécessaire d'utiliser plus d'un tableau masqué.
Par exemple, nous allons générer un tableau où chaque valeur 7 est un NAN:
arr = np.arange(100, dtype=float).reshape(10, 10)
arr[~(arr % 7).astype(bool)] = np.nan
Nous pouvons modifier la palette de couleurs actuelle et tracer le tableau avec les lignes suivantes:
current_cmap = matplotlib.cm.get_cmap()
current_cmap.set_bad(color='red')
plt.imshow(arr)