【问题标题】:Boxplot outlier labeling in RR中的箱线图异常值标记
【发布时间】:2011-10-28 12:54:31
【问题描述】:

我想在 R 中绘制箱线图并为异常值添加名称。到目前为止,我找到了this solution

那里的功能提供了我需要的所有功能,但它错误地打乱了标签。在以下示例中,它将异常值标记为“u”而不是“o”:

library(plyr)
library(TeachingDemos)
source("http://www.r-statistics.com/wp-content/uploads/2011/01/boxplot-with-outlier-label-r.txt") # Load the function
set.seed(1500)
y <- rnorm(20)
x1 <- sample(letters[1:2], 20,T)
lab_y <- sample(letters, 20)
# plot a boxplot with interactions:
boxplot.with.outlier.label(y~x1, lab_y)

您知道任何解决方案吗? ggplot2 库非常好,但没有提供这样的功能(据我所知)。我的替代方法是使用 text() 函数并从箱线图对象中提取异常值信息。但是,像这样标签可能会重叠。

非常感谢:-)

【问题讨论】:

  • 更新:我向 Tal Galili 提出了这个错误,几个小时后,他发布了一个脚本的编辑版本,不再出现这个问题。

标签: r


【解决方案1】:

我用debug(boxplot.with.outlier.label) 看了一下,结果...函数中有一个bug

错误发生在第 125 行,其中 data.frame DATAxylabel_name 构造而成。

以前的 xy 已重新排序,而 lab_y 尚未重新排序。当x(您的x1)提供的值本身不正常时,您将获得您所经历的那种混乱。

作为一个即时修复,您可以像这样预购 x 值(或者做一些更优雅的事情)

df <- data.frame(y, x1, lab_y, stringsAsFactors=FALSE)
df <- df[order(df$x1), ]
# Needed since lab_y is not searched for in data (though it probably should be)
lab_y <- df$lab_y  

boxplot.with.outlier.label(y~x1, lab_y, data=df)

【讨论】:

  • 谢谢乔希。几天前我遇到了同样的问题,所以这是一个很大的帮助 +1
  • 很高兴为您提供帮助。由于这看起来对其他人有用,所以我刚刚给脚本的作者发了电子邮件,因为他要求用户在发现脚本中的错误时这样做。
  • 更新:感谢 Josh 提出这个问题(并检测到函数中的故障点) - 我能够上传解决此问题的更新版本。谢谢乔希。最好的,塔尔
【解决方案2】:

intelligent point label placement 是在herehere 讨论的单独问题。没有终极和理想的解决方案,所以你只需要在那里选择一个。

所以你会用标签覆盖正常的箱线图,如下所示:

set.seed(1501)
y <- c(4, 0, 7, -5, rnorm(16))
x1 <- c("a", "a", "b", "b", sample(letters[1:2], 16, T))
lab_y <- sample(letters, 20)

bx <- boxplot(y~x1)

out_lab <- c()
for (i in seq(bx$out)) { 
    out_lab[i] <- lab_y[which(y == bx$out[i])[1]]
}

identify(bx$group, bx$out, labels = out_lab, cex = 0.7)

然后,在identify() 运行期间,您只需单击到您想要标签的位置, 如here 所述。完成后,您只需按“停止”。 请注意,每个异常值可以有多个标签!在我的解决方案中,我只是简单地选择了第一个!!

PS:我为 for 循环感到羞耻,但不知道如何对其进行矢量化 - 请随时发布改进。

编辑:受到Federico's link 的启发,现在我发现它可以更轻松地完成!就这两个命令:

boxplot(y~x1)
identify(as.integer(as.factor(x1)), y, labels = lab_y, cex = 0.7)

【讨论】:

  • identify() 解决方案很好,但它不可扩展,我有数百个图,我必须将它们打印为 PDF :-)
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 2021-11-06
  • 1970-01-01
  • 2020-08-27
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
相关资源
最近更新 更多