Boxplot标签异常值根据第三个变量

时间:2016-03-30 14:03:04

标签: r label boxplot

我正在尝试创建一个boxplot,其中异常值根据第三个变量而不是行名称进行标记。

我的数据如下所示:(现在编辑为包含多个国家/地区和行业作为因子变量)

country <- c(rep(LETTERS[1:5],2))
sector <- rep(c("one", "two"),5)
set.seed(200)
value <- round(rnorm(10),2)
dat <- data.frame(country,sector,value)
dat

   country sector value
1        A    one  0.08
2        B    two  0.23
3        C    one  0.43
4        D    two  0.56
5        E    one  0.06
6        A    two -0.11
7        B    one -1.02
8        C    two -0.30
9        D    one  0.17

10 E两个1.42

没有标签,boxplot是这样的:

boxplot(value ~ sector, data=dat)

我希望异常点上的标签反映变量国家/地区的值。

我在这里找到了一个类似的问题:Labeling outliers on boxplot in R我正在努力调整代码如下:

bxpdat <- boxplot(value ~ sector, data=dat)
text(bxpdat$group+0.2,                                           
bxpdat$out,                                                 
dat$country[which( dat$value == bxpdat$out, arr.ind=TRUE)[, 1]])  

然而,我似乎做错了,因为这不起作用。我非常感谢有关如何修复此代码的建议,

提前感谢!

1 个答案:

答案 0 :(得分:2)

轻微调整:

x <- boxplot(value ~ sector, data=dat)

text(x$group, x$out,
     labels=subset(dat, sector %in% x$group & 
                     value %in% x$out)$country, pos=4)

这不是一个很好的通用解决方案,因为subset匹配可能会意外地击中其他点。这会更好,但我不确定如何在base中执行此操作:

library(data.table); setDT(dat, key = c("sector", "value"))

dat[ , {
  x <- boxplot(value ~ sector, data=dat)
  with(x, text(group, out, .SD[.(group, out), country], pos = 4))}]