gpt4 book ai didi

python - 使 pyplot.hist() 第一个和最后一个 bin 包含离群值

转载 作者:太空狗 更新时间:2023-10-29 16:56:38 26 4
gpt4 key购买 nike

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

是否有可能使直方图的第一个和最后一个 bin 包含所有异常值而不改变 bin 的宽度

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

显然我可以 numpy.clip() 数据并绘制它,这会给我想要的东西。但我对是否有针对此的内置解决方案很感兴趣。

最佳答案

我也为此苦苦挣扎,不想使用 .clip() 因为它可能会产生误导,所以我写了一个小函数(大量借鉴 this )来指示上层和下层容器包含异常值:

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()

您还可以将它与自动离群值检测器(借自 here)结合使用,如下所示:

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))

Generated data from a standard normal and then added some outliers. Plots with and without outlier binning.

关于python - 使 pyplot.hist() 第一个和最后一个 bin 包含离群值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15837810/

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