19

pyplot.hist()文档指定在为直方图设置范围时“忽略上下异常值”

是否可以在不改变 bin 宽度的情况下使直方图的第一个和最后一个 bin 包含所有异常值?

例如,假设我想查看0-3具有 3 个 bin 的范围:(0-1, 1-2, 2-3为简单起见,我们忽略完全相等的情况)。我希望第一个 bin 包含从负无穷到 1 的所有值,最后一个 bin 包含从 2 到无穷大的所有值。但是,如果我明确地将这些箱设置为跨越该范围,它们将非常宽。我希望它们具有相同的宽度。我正在寻找的行为就像hist()在 Matlab 中的行为。

显然,我可以numpy.clip()绘制数据并绘制它,这将给我想要的东西。但是我很感兴趣,如果有一个内置的解决方案。

4

2 回答 2

11

我也在为此苦苦挣扎,并且不想使用,因为它可能会产生误导,所以我写了一个小函数(从this.clip()大量借用)来表明上部和下部 bin 包含异常值:

def outlier_aware_hist(data, lower=None, upper=None):
    if not lower or lower < data.min():
        lower = data.min()
        lower_outliers = False
    else:
        lower_outliers = True

    if not upper or upper > data.max():
        upper = data.max()
        upper_outliers = False
    else:
        upper_outliers = True

    n, bins, patches = plt.hist(data, range=(lower, upper), bins='auto')

    if lower_outliers:
        n_lower_outliers = (data < lower).sum()
        patches[0].set_height(patches[0].get_height() + n_lower_outliers)
        patches[0].set_facecolor('c')
        patches[0].set_label('Lower outliers: ({:.2f}, {:.2f})'.format(data.min(), lower))

    if upper_outliers:
        n_upper_outliers = (data > upper).sum()
        patches[-1].set_height(patches[-1].get_height() + n_upper_outliers)
        patches[-1].set_facecolor('m')
        patches[-1].set_label('Upper outliers: ({:.2f}, {:.2f})'.format(upper, data.max()))

    if lower_outliers or upper_outliers:
        plt.legend()

您还可以将其与自动异常值检测器(从此处借用)结合起来,如下所示:

def mad(data):
    median = np.median(data)
    diff = np.abs(data - median)
    mad = np.median(diff)
    return mad

def calculate_bounds(data, z_thresh=3.5):
    MAD = mad(data)
    median = np.median(data)
    const = z_thresh * MAD / 0.6745
    return (median - const, median + const)

outlier_aware_hist(data, *calculate_bounds(data))

从标准法线生成数据,然后添加一些异常值。 带有和不带有异常值分箱的图。

于 2018-06-26T20:16:48.117 回答
8

不。看着matplotlib.axes.Axes.hist和直接使用numpy.histogram我相当有信心地说没有比使用剪辑更聪明的解决方案(除了扩展直方图所用的箱)。

我鼓励您查看matplotlib.axes.Axes.hist(它只是 Python 代码,尽管公认 hist 比大多数 Axes 方法稍微复杂一些)的来源 - 这是验证此类问题的最佳方法。

于 2013-04-24T08:12:58.337 回答