在我们的数据集中,我们有一些绝对巨大的异常值。对数缩放没有帮助。但是我们想告诉读者异常值是存在的(并说出有多少个,在箱线图的哪一边,正的还是负的),最好不要手动添加文本到标题中。有没有好的方法来解决这个问题?最好是R,Matplotlib或Seaborn。
这不同于例如Ignore outliers in ggplot2 boxplot,因为我不想忽略异常值:我想证明它们的存在,但不是绘制它们。
示例代码:
# from https://stackoverflow.com/questions/5677885/ignore-outliers-in-ggplot2-boxplot
> library("ggplot")
> df = data.frame(y = c(-100, rnorm(100), 100))
> ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))我们看到了一个由于存在异常值而无用的箱线图。如果我们在该链接上遵循公认的答案,我们将以一种非常好的方式删除异常值,但现在读者没有意识到有任何异常值。
编辑一些评论/答案,询问我实际想要什么,但这正是困难所在--我知道我想要异常值(以及主要数据)的自动图形表示,但我不知道这到底应该是什么样子。我希望社区中的某些人知道针对这种情况的一些最佳实践。我不需要帮助编写代码来查找异常值或向图中添加文本。
发布于 2019-11-10 00:59:16
基本函数boxplot.stats()就是您所需要的。有关如何识别异常值的详细信息,请参阅帮助函数。这里有一种方法可以找到并报告异常值的存在。
set.seed(123) # make reproducible
y <- c(rnorm(3, -100), rnorm(3, 100), rnorm(100, 1))
y <- sample(y) # mix 'em up
out <- boxplot.stats(y)$out # find outliers
lo <- out[out < median(y)] # collect low
hi <- out[out > median(y)] # collect high
sel.lo <- which(y %in% lo) # collect positions of low
sel.hi <- which(y %in% hi) # collect positions of high
# Report on what was found
sprintf("%d low outliers and %d high outliers found",
length(lo), length(hi))
# [1] "3 low outliers and 3 high outliers found"出于打印目的,您可以在更合理的距离处将sel.lo和sel.hi标识的值替换为占位符。当然,更改数据并重新应用boxplot可能会更改统计数据并更改异常值的定义。
如果保留原始箱线图属性但没有异常值影响很重要,则可以使用boxplot.stats中的值设置绘图比例。
ylim <- 1.1 * boxplot.stats(y)$stats[c(1, 5)] # ends of the whiskers
par(mfrow = c(1,2), las = 2, mar = c(1, 4, 3, 1))
boxplot(y, main = "All data")
boxplot(y, ylim = ylim, main = "Outliers ignored")

https://stackoverflow.com/questions/55395681
复制相似问题