2014-12-05 42 views
4

我想繪製一個一維數組作爲pcolormesh(所以顏色沿着x軸變化,但在每個x的y軸是不變的)。但我的數據有一些不好的價值觀,所以我使用的是屏蔽數組,並設置爲藍色蒙面值的定製顏色表:pcolormesh與蒙面無效值

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import copy 

a = np.array([3, 5, 10, np.inf, 5, 8]) 
a = np.ma.masked_where(np.isinf(a), a) 
imdata = np.vstack((a, a)) 
myhot = copy.copy(cm.hot) 
myhot.set_bad('b', 1) 

fig, ax = plt.subplots() 
im = ax.pcolormesh(imdata, cmap=myhot) 
plt.colorbar(im) 
plt.show() 

,如果我沒有np.inf值它工作正常,但我只是如果我這樣做了一個空白的陰謀。我似乎誤解一些有關的方式set_bad作品,因爲我得到一個額外的警告:

RuntimeWarning: invalid value encountered in true_divide 
    resdat /= (vmax - vmin) 

我應該怎麼做才能得到我想要的效果呢?

回答

8

你需要屏蔽imdata,不一定a

import numpy as np 
import matplotlib.pyplot as plt 

a = np.array([3, 5, 10, np.inf, 5, 8]) 
imdata = np.ma.masked_invalid(np.atleast_2d(a)) 
cmap = plt.cm.hot 
cmap.set_bad('b', 1) 
fig, ax = plt.subplots() 
im = ax.pcolormesh(imdata, cmap=cmap) 

plt.colorbar(im) 
plt.show() 

enter image description here


如果您在交互式會話看imdata,你會看到

In [185]: imdata 
Out[185]: 
masked_array(data = 
[[ 3. 5. 10. inf 5. 8.] 
[ 3. 5. 10. inf 5. 8.]], 
      mask = 
False, 
     fill_value = 1e+20) 

以上,mask=False意味着什麼都沒有被掩蓋。如果包裝與np.ma.masked_invalid則:

In [186]: np.ma.masked_invalid(imdata) 
Out[186]: 
masked_array(data = 
[[3.0 5.0 10.0 -- 5.0 8.0] 
[3.0 5.0 10.0 -- 5.0 8.0]], 
      mask = 
[[False False False True False False] 
[False False False True False False]], 
     fill_value = 1e+20) 

問題與蒙anp.vstack不尊重面具。 或者,您可以使用np.ma.vstack。一般來說,只有 函數在np.ma命名空間尊重掩碼。

但是,您實際上並不需要在此使用vstack; np.atleast_2d會做。 vstack創建一個形狀數組(2, N),而np.atleast_2d創建一個形狀爲(1, N)的數組。


另一種替代方法是使用set_over代替set_bad。這將允許 您避免需要一個屏蔽數組乾脆:

import numpy as np 
import matplotlib.pyplot as plt 

a = np.array([3, 5, 10, np.inf, 5, 8]) 
imdata = np.atleast_2d(a) 
cmap = plt.cm.hot 
cmap.set_over('b') 
cmap.set_under('g') 
fig, ax = plt.subplots() 

b = a[np.isfinite(a)] 
im = ax.pcolormesh(imdata, cmap=cmap, vmin=b.min(), vmax=b.max()) 

plt.colorbar(im, extend='both') 
plt.show() 

enter image description here

extend='both' in conjunction with set_overset_under給你這表明用於超出了彩條的範圍值的顏色的彩條小彩色箭頭。

+0

謝謝你這個非常完整的答案:我從中學到了很多東西! – xnx 2014-12-05 21:24:53