Próbuję użyć imshow w matplotlib do wykreślenia danych jako mapy cieplnej, ale niektóre wartości to NaN. Chciałbym, aby NaN były renderowane jako specjalny kolor, którego nie ma w mapie kolorów.
przykład:
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()
Powstały obraz jest nieoczekiwanie cały niebieski (najniższy kolor na mapie kolorów odrzutowca). Jeśli jednak robię wykres w ten sposób:
ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)
- wtedy dostaję coś lepszego, ale wartości NaN są rysowane w tym samym kolorze co vmin ... Czy istnieje wdzięczny sposób, aby ustawić NaN tak, aby były rysowane w specjalnym kolorze (np.: szary lub przezroczysty)?
python
matplotlib
nan
Adam Fraser
źródło
źródło
matplotlib.__version__=='1.2.1'
) działa to bez problemu.Odpowiedzi:
W nowszych wersjach Matplotlib nie jest już konieczne używanie zamaskowanej tablicy.
Na przykład, wygenerujmy tablicę, w której każda siódma wartość to NaN:
arr = np.arange(100, dtype=float).reshape(10, 10) arr[~(arr % 7).astype(bool)] = np.nan
Możemy zmodyfikować aktualną mapę kolorów i wykreślić tablicę za pomocą następujących linii:
current_cmap = matplotlib.cm.get_cmap() current_cmap.set_bad(color='red') plt.imshow(arr)
źródło
arr = np.ma.array(arr, mask=(arr == 0))
.Hrm, wygląda na to, że mogę użyć do tego zamaskowanej tablicy:
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)
To powinno wystarczyć, chociaż nadal jestem otwarty na sugestie. :]
źródło
matplotlib.cm.jet
, więc zazwyczaj wykonać kopię:import copy; cmap=copy.copy(matplotlib.cm.jet)
. Ponadto, jeśli chcesz ustawić wartości 0 na inny kolor, coś takiegocmap._init(); cm._lut[:,0] = (1,1,1,1)
powinno działać.set_over
iset_under
do kontrolowania kolorowania wartości spoza zakresu. Domyślnym zachowaniem jest dopasowanie górnej / dolnej części zakresu kolorów.masked_array
w ogóle wymagane? Jeślia
zawiera wartości NaN (tak się wydajemask=np.isnan(a)
), to samoimshow
ustawienie tablicya
z dostosowaną mapącmap
spowoduje wyświetlenie komórek NaN w wymaganym kolorze (białym). Więc to działa dla mnie. Czy są jakieś wyjątki?nan
wartości i wartości mediany były wykreślane tym samym kolorem, np. Białym.