2010-04-05 147 views
62

我試圖在matplotlib中使用imshow來繪製數據作爲熱圖,但其中一些值是NaN。我想將NaN渲染爲在顏色映射中找不到的特殊顏色。如何使用matplotlib中的imshow將NaN值繪製爲特殊顏色?

例如:

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

所得圖像是出乎意料所有藍色(顏色在顏色表射流最低)。但是,如果我做的策劃是這樣的:

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

--then我得到更好的東西,但NaN值繪製的顏色相同VMIN ...有,我可以設置的NaN到優雅的方式用特殊顏色繪製(例如:灰色或透明)?

+0

幾年後('matplotlib .__ version __ =='1.2.1''),這個工作沒有問題。 – 2014-03-04 16:24:58

回答

60

HRM,看來我可以使用屏蔽數組做到這一點:

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) 

這應該足夠了,但我仍然開放的建議。 :]

+0

它絕對是訣竅。官方文檔只顯示了其他內容。 – Agos 2011-05-11 15:36:13

+5

一個側面 - 我認爲這樣做會覆蓋默認的'matplotlib.cm.jet',所以我通常會做一個副本:'import copy; CMAP = copy.copy(matplotlib.cm.jet)'。另外,如果你想設置0值爲不同的顏色,比如'cmap._init(); cm._lut [:,0] =(1,1,1,1)'應該有效。 – keflavich 2013-02-23 19:56:43

+2

還有'set_over'和'set_under'來控制超出範圍值的顏色。默認行爲是匹配顏色範圍的頂部/底部。 – tacaswell 2014-11-03 13:41:33

3

它沒有爲我工作。我得到錯誤信息,所以沒有解決方法:

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

如果您發佈了您收到的錯誤,它可能會有所幫助。 – 2012-05-07 19:52:37

7

隨着Matplotlib有更新版本,沒有必要再使用一個屏蔽數組。

例如,讓我們產生一個數組,其中每7個值是NaN:

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

我們可以通過修改當前的顏色表並繪製與以下行數組:

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

plot result

相關問題