2010-04-05 6 views
62

Ich versuche, Imshow in Matplotlib zu verwenden, um Daten als Heatmap zu plotten, aber einige der Werte sind NaNs. Ich möchte, dass die NaNs als spezielle Farbe gerendert werden, die nicht in der Colormap gefunden wird.Wie kann ich NaN-Werte als Sonderfarbe mit imshow in Matplotlib darstellen?

Beispiel:

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

Das resultierende Bild ist unerwartet alle blau (die niedrigste Farb im Strahl colormap). Allerdings, wenn ich tun Plotten das wie folgt aus:

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

--then ich etwas besser, aber die NaN-Werte sind die gleiche Farbe wie vmin gezeichnet ... Gibt es eine elegante Art und Weise, die ich setzen kann NaNs zu mit einer speziellen Farbe gezeichnet werden (zB: grau oder transparent)?

+0

Ein paar Jahre später ('matplotlib .__ Version __ == '1.2.1''), das funktioniert problemlos. –

Antwort

60

Hrm, scheint es ich um ein maskiertes Array, dies zu tun verwenden können:

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) 

Dies sollte ausreichen, wenn ich auf die Vorschläge noch offen bin. :]

+0

Es ist definitiv der Trick. Offizielle Dokumente zeigen nichts mehr. – Agos

+5

Ein Nebenpunkt - ich denke, dies wird den Standard 'matplotlib.cm.jet' überschreiben, also mache ich normalerweise eine Kopie:' import copy; cmap = copy.copy (matplotlib.cm.jet) '. Wenn Sie auch 0-Werte auf eine andere Farbe setzen möchten, so etwas wie 'cmap._init(); cm._lut [:, 0] = (1,1,1,1) 'sollte funktionieren. – keflavich

+2

Es gibt auch 'set_over' und' set_under', um die Färbung von Werten außerhalb des zulässigen Bereichs zu steuern. Das Standardverhalten entspricht dem oberen/unteren Rand des Farbbereichs. – tacaswell

3

Es hat nicht für mich funktioniert. Ich war Fehlermeldung bekommen, so tat Abhilfe:

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

würde es wahrscheinlich hilfreich sein, wenn Sie gepostet haben, welchen Fehler Sie bekommen haben. –

7

Bei neueren Versionen von Matplotlib, ist es nicht mehr notwendig, eine maskierte Array zu verwenden.

Zum Beispiel, lassen Sie uns ein Array erzeugen, wo jeder siebte Wert ein NaN ist:

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

Wir können den aktuellen colormap ändern und zeichnen das Array mit den folgenden Zeilen:

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

plot result