【问题标题】:Boxplotting multiple masked arrays箱线图绘制多个掩码数组
【发布时间】:2019-02-26 18:50:06
【问题描述】:

我正在尝试绘制几个数组,这些数组掩盖了我的数据集中的所有 -9999 值(设备故障值)。似乎 np.boxplot 忽略了值的掩码并无论如何都绘制它们。如何让 numpy 排除每个数据集中的屏蔽值?

import numpy as np
import matplotlib.pyplot as plt

a = np.ma.array([229.5,374.0,536.5,-9999,-9999,-9999,-9999,-9999,182.0,42.5,49.0])
b = np.ma.array([363.0,118.5,159.0,-9999,311.0,516.0,380.0,338.5,223.0,211.5,128.5])
c = np.ma.array([205.5,277.5,141.5,278.0,302.0,251.0,299.0,250.0,315.5,92.1,211.9])

a = np.ma.masked_less( a, -9000 )
b = np.ma.masked_less( b, -9000 )
c = np.ma.masked_less( c, -9000 )

data_to_plot = [ a , b, c ]
labels = [ 'a', 'c', 'c' ]

fig = plt.figure( 3, figsize = ( 8, 10 ) )
ax = fig.add_subplot( 111, frameon = False )
bp = ax.boxplot( data_to_plot, patch_artist = True, widths = .85, 
                labels = labels, vert = True)
plt.setp( bp[ 'boxes' ], color = 'black', alpha = .8, linewidth = 3 )
plt.setp( bp[ 'whiskers' ], color = 'black', linewidth = 3 )
plt.setp( bp[ 'fliers' ], markeredgecolor = 'black', alpha = 1, markersize = 30, marker = '.' )
plt.setp( bp[ 'medians' ], color = 'orange', linewidth = 3 )
plt.setp( bp[ 'means' ], color = 'black' )
plt.setp( bp[ 'caps' ], color = 'black', linewidth = 4 )

colors = ['r', 'b', 'g', ]
for b in ( bp ):
    for patch, color in zip( bp[ 'boxes' ], colors ):
        patch.set_facecolor( color )
plt.show()

【问题讨论】:

    标签: python numpy matplotlib boxplot


    【解决方案1】:

    您的代码会产生错误,因此很难判断这是否是您正在使用的代码。我不确定 matplotlib 如何处理屏蔽数组,因为我通常会创建一个只包含我需要的数据的新数组。您可以替换:

     a = np.ma.masked_less( a, -9000 )
     b = np.ma.masked_less( b, -9000 )
     c = np.ma.masked_less( c, -9000 )
    

     a = a[a>-9000]
     b = b[b>-9000]
     c = c[c>-9000]
    

    【讨论】:

    • 同时this shows matplotlib 忽略掩码值。
    • @Parfait,你是 Gotham 需要的英雄。该链接很好地显示了 matplotlib 的局限性。答案仍然解决了如何,但评论解决了原因。
    • @Parfait 我在发布之前通读了一遍,但不确定它到底显示了什么(在编码方面我有点像新手)。它是否表明它只是改变了它所查看的值范围以排除被屏蔽的值?编辑:另外,代码非常相似,但我改变了调用数据的方式,因为它是一个大数据帧(834 x 166),所以我猜是从那里来的错误。
    • 放入新代码后,数组从[229.5,374.0,536.5,-9999.0,-9999.0,-9999.0,-9999.0,-9999.0,182.0,103.5,68.0,43.0, 42.5,49.0] 到 [229.5,374.0,536.5,93.5,89.5,98.0,86.0,102.0,124.0,52.0,62.0,79.5,78.5,74.0]。是否应该用不等式语句替换 ma.masked_less 来替换 -9999 这样的值并更改这些数据?
    • @danrod13 ... 我看到的唯一区别是链接使用np.ma.masked_wherenp.ma.masked_less 是每个docs 的此方法的便捷包装器。从您的代码中,我不知道为什么绘图不会掩盖您的预期范围。可能它与负值有关。我会将其作为一个可能的错误发布在 Git issue 中,供 matplotlib 团队使用。一定要包括一个像你在这里做的可重现的例子。
    【解决方案2】:

    https://github.com/matplotlib/matplotlib/issues/13533

    解决 matplotlib.boxplots 无法识别掩码值的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-09-30
      • 2017-11-17
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2014-02-21
      相关资源
      最近更新 更多