gpt4 book ai didi

python - 具有屏蔽无效值的 pcolormesh

转载 作者:太空狗 更新时间:2023-10-30 00:40:22 26 4
gpt4 key购买 nike

我正在尝试将一维数组绘制为 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()

enter image description here


如果您在交互式 session 中查看 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 命名空间中的函数遵循掩码。

但是,您实际上不需要在这里使用vstacknp.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 会在颜色条上为您提供彩色小箭头,指示用于超出颜色条范围的值的颜色。

关于python - 具有屏蔽无效值的 pcolormesh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27324245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com