你需要屏蔽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](https://i.stack.imgur.com/wMcPf.png)
如果您在交互式会话看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)
问题与蒙a
是np.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](https://i.stack.imgur.com/Luo0n.png)
的extend='both'
in conjunction with set_over
和set_under
给你这表明用于超出了彩条的范围值的颜色的彩条小彩色箭头。
谢谢你这个非常完整的答案:我从中学到了很多东西! – xnx 2014-12-05 21:24:53