5

我想将矩阵的每一列绘制为箱线图,然后将每个箱线图中的异常值标记为它们在矩阵中所属的行名。举个例子:

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 行。有没有简单的方法可以做到这一点?我已经看到了与此问题类似的问题,但似乎没有一个按照我想要的方式工作。

4

6 回答 6

8

有一个简单的方法。请注意,以下行中 Boxplot 中的 b 是大写字母。

library(car)

Boxplot(y ~ x, id.method="y")
于 2014-10-22T05:11:55.710 回答
5

或者,您可以使用 {car} 包中的“Boxplot”函数为您标记异常值。

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

于 2014-02-28T17:40:29.430 回答
4

在给出的示例中,这有点无聊,因为它们都是同一行。但这里是代码:

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)  

这会在boxplot. Boxplot 调用并返回来自 的值boxplot.stats。看一眼:

 str(bxpdat)
于 2013-03-03T00:42:11.537 回答
4

@DWin 的解决方案适用于单个箱线图,但对于具有重复值的任何内容都会失败,例如我创建的数据集:

#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)

在这个数据集上,@DWin 的解决方案给出了:

在此处输入图像描述

这是错误的,因为在第四个示例中,最小值和最大值不可能在同一行中。

这个解决方案很可怕(我希望可以简化),但很有效。

#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))

在此处输入图像描述

于 2013-03-03T01:26:02.687 回答
1

或者您可以简单地运行此博客文章中的代码:

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)

(处理多个彼此接近的异常值)

在此处输入图像描述

于 2013-08-21T20:43:36.087 回答
0

@sebastian-c 这是对 DWin 解决方案的轻微修改,似乎更通用

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
  )
}
于 2013-12-03T11:16:37.530 回答