2014-12-05 44 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