NaN değerlerini matplotlib'de imshow ile özel bir renk olarak nasıl çizebilirim?


85

Verileri ısı haritası olarak çizmek için matplotlib'de imshow'u kullanmaya çalışıyorum, ancak bazı değerler NaN'ler. NaN'lerin renk haritasında bulunmayan özel bir renk olarak görüntülenmesini istiyorum.

misal:

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

Ortaya çıkan görüntünün tamamı beklenmedik bir şekilde mavidir (jet renk haritasındaki en düşük renk). Ancak, komployu şu şekilde yaparsam:

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

- sonra daha iyi bir şey elde ederim, ancak NaN değerleri vmin ile aynı renkte çiziliyor ... NaN'leri özel bir renkle çizmek için zarif bir yol var mı (örneğin: gri veya şeffaf)?


Birkaç yıl sonra ( matplotlib.__version__=='1.2.1'), bu sorunsuz çalışır.
Frédéric Grosshans

Yanıtlar:


47

Matplotlib'in daha yeni sürümleriyle, artık maskeli bir dizi kullanmak gerekli değildir.

Örneğin, her 7. değerin bir NaN olduğu bir dizi oluşturalım:

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

Mevcut renk haritasını değiştirebilir ve diziyi aşağıdaki satırlarla çizebiliriz:

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

arsa sonucu


np.nan yerine 0 kullanmak mümkün mü?
yukashima huksay

2
@yukashimahuksay: evet, ama bu değerleri maskelemeniz gerekir. Örneğin. arr = np.ma.array(arr, mask=(arr == 0)).
Arcturus B

Bence 'cmap'deki' c 'zaten' geçerli 'anlamına geliyor, bu yüzden' current_cmap 'değişkenini çağırmam
T. Gwen

3
@TGwen: cmap'in doc'ta kullanılan terim olan colormap'i ifade ettiğinden oldukça eminim: matplotlib.org/api/cm_api.html#matplotlib.cm.get_cmap
Arcturus B

82

Hrm, bunu yapmak için maskeli bir dizi kullanabilirim gibi görünüyor:

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)

Bu yeterli olmalı, yine de önerilere açık olsam da. :]


Kesinlikle hile yapıyor. Resmi belgeler daha fazlasını göstermez.
Agos

6
Bir yan noktası - Ben bu varsayılan geçersiz kılar yapıyor düşünüyorum matplotlib.cm.jetben genelde kopyasını yapmak, böylece,: import copy; cmap=copy.copy(matplotlib.cm.jet). Ayrıca, 0 değerlerini farklı bir renge ayarlamak istiyorsanız, bunun gibi bir şey cmap._init(); cm._lut[:,0] = (1,1,1,1)çalışmalıdır.
keflavich

3
Orada da set_overve set_underaralık değerlerinin out renklendirme kontrol etmek. Varsayılan davranış, renk aralığının üst / alt kısmıyla eşleşmektir.
tacaswell

2
Hiç masked_arraygerekli mi? Eğer a(o kadar görünüyor böylece NaN değerleri içeren mask=np.isnan(a)sonra sadece,) imshowdizi -Ing aözelleştirilmiş harita ile cmapgerekli renk (beyaz) ile NaN-hücrelerini gösterir. Yani benim için çalışıyor. Herhangi bir istisna var mı?
MaciekS

2
@MaciekS, farklı bir renk haritası kullanırken, nandeğerlerinizin ve medyan değerlerinin aynı renkte, örneğin beyaz olarak çizilmesini istemezsiniz .
AGS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.