web-dev-qa-db-fra.com

Comment puis-je tracer des valeurs NaN comme 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 NaN soient rendus comme une couleur spéciale que l'on 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 entièrement bleue (la couleur la plus basse de la palette de couleurs du jet). Cependant, si je fais le tracé comme ceci:

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

--Alors j'obtiens quelque chose de mieux, mais les valeurs NaN sont dessinées de la même couleur que vmin ... Existe-t-il un moyen gracieux de définir les NaN à dessiner avec une couleur spéciale (par exemple: gris ou transparent)?

74
Adam Fraser

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, même si je suis toujours ouvert aux suggestions. :]

73
Adam Fraser

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

plot result

29
Arcturus B

Ça n'a pas marché pour moi. J'obtenais un message d'erreur, tout comme la solution de contournement:

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)
2
Sergey