在箱线图中,如何显示异常值存在,但实际上并未绘制出来?

时间:2019-03-28 10:47:33

标签: r matplotlib seaborn outliers

在我们的数据集中,我们有一些绝对巨大的异常值。如果我们绘制(例如在箱线图中)并包括离群值,则轴将被挤压到无用。日志扩展没有帮助。但是我们想告诉读者,离群值存在(并说出正负有多少个,在箱线图的哪一侧,正数或负数),最好不要在标题中手动添加文本。有一个好的方法吗?最好在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)))

我们看到一个由于存在异常值而无用的箱线图。如果我们遵循该链接上可接受的答案,则会以一种非常不错的方式删除异常值,但是现在读者没有意识到任何异常值。

1 个答案:

答案 0 :(得分:0)

您需要基本功能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.losel.hi标识的值。当然,更改数据并重新应用箱线图可能会更改统计信息并更改异常值的定义。

如果保留原始箱形图属性但没有异常影响很重要,则可以使用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")

boxplot examples