Wie kann ich NaN-Werte als Sonderfarbe mit imshow in matplotlib plotten?
-
24-09-2019 - |
Frage
Ich versuche, in matplotlib zu Plotdaten als Heatmap zu verwenden imshow, aber einige der Werte sind NaNs. Ich mag die NaNs als Sonderfarbe nicht in der colormap gefunden gemacht werden.
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 (der niedrigste Farb im Strahl colormap). Allerdings, wenn ich das Plotten wie folgt aus:
ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)
- dann bekomme ich etwas besser, aber die NaN-Werte sind die gleiche Farbe wie vmin gezeichnet ... Gibt es eine anmutige Art und Weise, dass ich NaNs einstellen kann mit einer speziellen Farbe gezeichnet werden (zB: grau oder transparent)?
Lösung
Hrm, scheint es, ich eine maskierte Array verwenden kann, dies zu tun:
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)
Das sollte genügen, wenn ich auf die Vorschläge noch offen bin. :]
Andere Tipps
Bei neueren Versionen von Matplotlib, ist es nicht mehr notwendig, eine maskierte Array zu verwenden.
Zum Beispiel erzeugen wir ein Array, wo jeder siebte Wert ist ein NaN:
arr = np.arange(100, dtype=float).reshape(10, 10)
arr[~(arr % 7).astype(bool)] = np.nan
Wir können die aktuelle colormap ändern und das Array mit den folgenden Zeilen plotten:
current_cmap = matplotlib.cm.get_cmap()
current_cmap.set_bad(color='red')
plt.imshow(arr)