上中的R标记箱线图离群(Labeling outliers on boxplot in R)

2019-08-17 06:49发布

我想绘制矩阵的每个列的箱线图,然后在每个箱线图,因为他们属于在矩阵的行名称标记异常值。 为了给出一个例子:

vv=matrix(c(1,2,3,4,8,15,30),nrow=7,ncol=4,byrow=F)
rownames(vv)=c("one","two","three","four","five","six","seven")
boxplot(vv)

我便想在每个小区离群值(在本例中30)作为行名称属于,所以在这种情况下,30属于第7行是否有一个简单的方法来做到这一点? 我也有类似的问题,这个要求,但没有似乎已经工作,我希望它的方式。

Answer 1:

在这个例子给它有点无聊,因为他们都在同一行。 但这里是代码:

bxpdat <- boxplot(vv)
text(bxpdat$group,                                              # the x locations 
     bxpdat$out,                                                # the y values
     rownames(vv)[which(vv == bxpdat$out, arr.ind=TRUE)[, 1]],  # the labels
     pos = 4)  

此挑选有等于结果的“走出去”列表(即异常值)值rownames boxplot 。 箱形图调用和返回值boxplot.stats 。 看一眼:

 str(bxpdat)


Answer 2:

有一个简单的方法。 注意,在箱形图是b在以下几行是一个大写字母。

library(car)

Boxplot(y ~ x, id.method="y")


Answer 3:

,或者也可以使用“箱形图”功能从{}车包,其中标签离群你。

请参阅以下链接: https://CRAN.R-project.org/package=car



Answer 4:

@迪文的解决方案非常适用于单箱线图,但会失败有重复值的东西,就像我所创建的数据集:

#Create data
set.seed(1)
basenums <- c(1,2,3,4,8,15,30)
vv=matrix(c(basenums, sample(basenums), 1-basenums, 
          c(0, 29, 30, 31, 32, 33, 60)),nrow=7,ncol=4,byrow=F)
dimnames(vv)=list(c("one","two","three","four","five","six","seven"), 1:4)

在此数据集,@迪文的解决方案为:

这是假的,因为在第4个例子,这是不可能的最小值和最大值是同一排。

该解决方案是可怕的(我希望可以简化),但有效。

#Reshape data
vv_dat <- as.data.frame(vv)
vv_dat$row <- row.names(vv_dat)
library(reshape2)
new_vv <- melt(vv_dat, id.vars="row")

#Get boxplot data
bxpdat <- as.data.frame(boxplot(value~variable, data=new_vv)[c("out", "group")])

#Get matches with boxplot data
text_guide <- do.call(rbind, apply(bxpdat, 1, 
    function(x) new_vv[new_vv$value==x[1]&new_vv$variable==x[2], ]))

#Add labels
with(text_guide, text(x=as.numeric(variable)+0.2, y=value, labels=row))



Answer 5:

@塞巴斯蒂安-C这是迪文溶液的轻微修改,似乎与更通用的工作

bx1<-boxplot(pb,las=2,cex.axis=.8)
if(length(bx1$out)!=0){
  ## get the row of each outlier
  out.rows<-sapply(1:length(bx1$out),function(i) which(vv[,bx1$group[i]]==bx1$out[i]))
  text(bx1$group,bx1$out,
     rownames(vv)[out.rows],
     pos=4
  )
}


Answer 6:

或者你可以简单地从运行的代码这个博客帖子 :

source("https://raw.githubusercontent.com/talgalili/R-code-snippets/master/boxplot.with.outlier.label.r") # Load the function
set.seed(6484)
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)

(其处理多个离群其是彼此接近)



文章来源: Labeling outliers on boxplot in R