2010-04-05 8 views
62

Verileri bir ısı haritası olarak çizmek için matplotlib'de imshow kullanmaya çalışıyorum, ancak bazı değerler NaN'dir. NaN'lerin renk eşleminde bulunmayan özel bir renk olarak gösterilmesini isterim.NaN değerlerini matplotlib'de imshow ile özel bir renk olarak nasıl çizebilirim?

örnek:

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

elde edilen görüntü tüm mavi (püskürtme renk haritası en düşük renk) beklenmedik bir şekilde. ... Ben NaN'ler ayarlayabilirsiniz zarif bir şekilde var mı daha iyi bir şey olsun -O zaman

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

ama NaN değerleri Vmin aynı renk çizilir: yapmam Ancak, böyle komplo özel bir renkle çizilmelidir (örneğin: gri veya şeffaf)?

+0

Birkaç yıl sonra ('matplotlib .__ version __ == '1.2.1' '), bu problemsiz çalışır. –

cevap

60

Hrm, bunu yapmak maskeli dizi kullanabilirsiniz görüntülenir: Hala önerilere açığım olsa

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 olacaktır. :

+0

Kesinlikle hile yapar. Resmi dokümanlar daha fazlasını göstermez. – Agos

+5

Bir yan nokta - Bunu yapmak varsayılan 'matplotlib.cm.jet' geçersiz kılacak düşünüyorum, bu yüzden genellikle bir kopyasını yapmak: 'import copy; CMAP = copy.copy (matplotlib.cm.jet) '. Ayrıca, 0 değerlerini farklı bir renge ayarlamak isterseniz, cmap._init() gibi bir şey; cm._lut [:, 0] = (1,1,1,1) 'çalışmalıdır. – keflavich

+2

Ayrıca, aralık değerlerinin renklendirmesini kontrol etmek için 'set_over' ve' set_under' vardır. Varsayılan davranış, renk aralığının üst/altını eşleştirmektir. – tacaswell

3

Benim için çalışmadı. Ben hata mesajı başlamıştı, bu yüzden geçici çözümü yaptı: Matplotlib yeni sürümlerinde ile

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

, aldığınız bir hatayı yayınladıysanız muhtemelen yardımcı olacaktır. –

7

, artık bir maskeli dizi kullanmak gerekli değildir. her 7. değeri NaN burada Örneğin

, en bir dizi oluşturmak izin:

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

Biz mevcut renk haritası değiştirmek ve aşağıdaki çizgilerle dizi çizmek için:

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

plot result

İlgili konular