【问题标题】:pcolormesh with masked invalid values带有屏蔽无效值的 pcolormesh
【发布时间】:2014-12-05 20:35:23
【问题描述】:

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

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

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    你需要屏蔽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 命名空间中的函数尊重掩码。

    但是,您实际上不需要在这里使用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()
    

    extend='both' in conjunction with set_overset_under 在颜色条上为您提供小彩色箭头,指示用于超出颜色条范围的值的颜色。

    【讨论】:

    • 感谢您提供如此完整的答案:我从中学到了很多!
    猜你喜欢
    • 2018-05-08
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多