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

War es hilfreich?

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)

plot Ergebnis

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top