我在生成ggplot时遇到问题。
我的情节是一个简单的盒子图,但带有额外的注释。
这些注释是多重比较的显着性水平。
DatamineR在这里更好地解释了这一点:How to draw the boxplot with significant level?
我只想绘制那些显着不同并希望功能强大的功能。
所以为了简单起见,我只想将X
行添加到ggplot中
示例:
custom.plot <- function{
n.sig <- number of significant observations obtained by a different function
my.plot <- ggplot(data,aes(x,y)) + geom_boxplot()
### HERE should be a function that adds other layers to my plot
}
我现在如何制作一个能为我的情节添加n.sig
行的功能?
n.sig = 3
意味着以下内容:
my.plot +
geom_line(data1,aes(x1,y1))+
geom_line(data2,aes(x2,y2))+
geom_line(data3,aes(x3,y3))
我已经拥有geom_line
个函数的所有数据框,我发现我可以使用这个函数创建一个函数调用
do.call("geom_line",list("data1","aes(x1,y1)")
但是我怎样才能将它变成ggplot
的一个大函数调用?
换句话说,我想要为基础图编写的这个函数在ggplot2中工作:
all.f <-function(x,y){
boxplot(data[,y]~data[,x],ylab=y,xlab="")
dt <- dunn.test(data[,y],data[,x],method="bonferroni")
### Split outcome by group
out.sp <- split(data[,y],data[,x])
len.vars <- sapply(out.sp,length)
len.all <- length(len.vars)
imp.dt<-which(dt$P.adjusted<0.05)
check.pairs <- function(x){
if(x==1){
return(cbind(1,2))
}else if(x==2){
return(cbind(1,3))
}else if(x==3){
return(cbind(2,3))
}else if(x==4){
return(cbind(1,4))
}else if(x==5){
return(cbind(2,4))
}else if(x==6){
return(cbind(3,4))
}else if(x==7){
return(cbind(1,5))
}else if(x==8){
return(cbind(2,5))
}else if(x==9){
return(cbind(3,5))
}else if(x==10){
return(cbind(4,5))
}else{
return(NA)
}
}
connections <- sapply(imp.dt,check.pairs)
n.connections <- length(imp.dt)
df.con <- list(NULL)
my <-max(data[,y],na.rm=T)
cord <- NULL
for(i in 1:n.connections){
cord <- c(cord,my-((0+i)*my*0.03))
}
connect<-matrix(rbind(connections,cord),nrow=3)
boxplot(data[,y]~data[,x],ylab=y,xlab="")
if(!n.connections==0){
for(i in 1:n.connections){
segments(connect[1,i],connect[3,i],connect[2,i],connect[3,i])
}
} else {
NULL
}
}
在mtcars上运行它:
data<-mtcars
data$cyl<-as.factor(data$cyl)
all.f("cyl","mpg")