88 votes

Comment puis-je représenter les valeurs NaN dans une couleur spéciale avec imshow dans matplotlib ?

J'essaie d'utiliser imshow dans matplotlib pour tracer des données sous forme de carte thermique, mais certaines des valeurs sont des NaN. J'aimerais que les NaNs soient rendus par une couleur spéciale qui ne se trouve pas dans la carte des 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 manière inattendue, entièrement bleue (la couleur la plus basse dans la carte des couleurs du jet). Cependant, si j'effectue le tracé comme suit :

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

--j'obtiens alors quelque chose de mieux, mais les valeurs NaN sont dessinées de la même couleur que vmin... Est-ce qu'il y a un moyen gracieux de faire en sorte que les valeurs NaN soient dessinées avec une couleur spéciale (par exemple : gris ou transparent) ?

0 votes

Quelques années plus tard ( matplotlib.__version__=='1.2.1' ), cela fonctionne sans problème.

85voto

Adam Fraser Points 1639

Hrm, il semble que je puisse utiliser un tableau masqué pour ce faire :

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 reste ouvert aux suggestions :]

0 votes

Il fait vraiment l'affaire. Les documents officiels ne montrent rien de plus.

7 votes

Un point secondaire : je pense que cette opération aura pour effet d'annuler la valeur par défaut de l'option matplotlib.cm.jet Je fais donc généralement une copie : import copy; cmap=copy.copy(matplotlib.cm.jet) . De même, si vous souhaitez donner une couleur différente aux valeurs 0, quelque chose comme cmap._init(); cm._lut[:,0] = (1,1,1,1) devrait fonctionner.

3 votes

Il y a aussi set_over y set_under pour contrôler la coloration des valeurs hors plage. Le comportement par défaut est de correspondre au haut/bas de la gamme de couleurs.

72voto

Arcturus B Points 1350

Avec les nouvelles versions de Matplotlib, il n'est plus nécessaire d'utiliser un tableau masqué.

Par exemple, générons un tableau où chaque 7ème valeur est un NaN :

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

Nous pouvons modifier la carte des 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)

plot result

2voto

Sergey Points 66

Cela n'a pas fonctionné pour moi. Je recevais un message d'erreur, j'ai donc trouvé une solution :

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X