繁体   English   中英

带有蒙版无效值的pcolormesh

[英]pcolormesh with masked invalid values

我试图将一维数组绘制为pcolormesh(因此颜色沿x轴变化,但对于每个x在y轴上是恒定的)。 但是我的数据有一些不好的值,所以我使用了一个蒙版数组和一个自定义颜色图,其掩码值设置为蓝色:

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)

我应该怎么做才能得到我想要的效果?

你需要掩盖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()

在此输入图像描述


如果你在交互式会话中查看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命名空间中的函数np.ma遵循掩码。

但是,你实际上并不需要在这里使用vstack ; np.atleast_2d会这样做。 vstack创建一个shape (2, N)数组,而np.atleast_2d创建一个shape (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()

在此输入图像描述

extend='both'set_overset_under 一起在colorbar上给出了很少的彩色箭头,表示用于超出colorbar范围的值的颜色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM