【发布时间】:2017-10-05 07:52:58
【问题描述】:
在许多关于如何制作带有分面和显着性水平的箱线图的问题之后,尤其是this 和this,我还有一个小问题。
我设法制作了如下所示的情节,这正是我想要的。
我现在面临的问题是当我很少或没有重要的比较时;在这些情况下,用于显示显着性级别的括号的整个空间仍然保留,但我想摆脱它。
请使用 iris 数据集检查此 MWE:
library(reshape2)
library(ggplot2)
data(iris)
iris$treatment <- rep(c("A","B"), length(iris$Species)/2)
mydf <- melt(iris, measure.vars=names(iris)[1:4])
mydf$treatment <- as.factor(mydf$treatment)
mydf$variable <- factor(mydf$variable, levels=sort(levels(mydf$variable)))
mydf$both <- factor(paste(mydf$treatment, mydf$variable), levels=(unique(paste(mydf$treatment, mydf$variable))))
a <- combn(levels(mydf$both), 2, simplify = FALSE)#this 6 times, for each lipid class
b <- levels(mydf$Species)
CNb <- relist(
paste(unlist(a), rep(b, each=sum(lengths(a)))),
rep.int(a, length(b))
)
CNb
CNb2 <- data.frame(matrix(unlist(CNb), ncol=2, byrow=T))
CNb2
#new p.values
pv.df <- data.frame()
for (gr in unique(mydf$Species)){
for (i in 1:length(a)){
tis <- a[[i]] #variable pair to test
as <- subset(mydf, Species==gr & both %in% tis)
pv <- wilcox.test(value ~ both, data=as)$p.value
ddd <- data.table(as)
asm <- as.data.frame(ddd[, list(value=mean(value)), by=list(both=both)])
asm2 <- dcast(asm, .~both, value.var="value")[,-1]
pf <- data.frame(group1=paste(tis[1], gr), group2=paste(tis[2], gr), mean.group1=asm2[,1], mean.group2=asm2[,2], log.FC.1over2=log2(asm2[,1]/asm2[,2]), p.value=pv)
pv.df <- rbind(pv.df, pf)
}
}
pv.df$p.adjust <- p.adjust(pv.df$p.value, method="BH")
colnames(CNb2) <- colnames(pv.df)[1:2]
# merge with the CN list
pv.final <- merge(CNb2, pv.df, by.x = c("group1", "group2"), by.y = c("group1", "group2"))
# fix ordering
pv.final <- pv.final[match(paste(CNb2$group1, CNb2$group2), paste(pv.final$group1, pv.final$group2)),]
# set signif level
pv.final$map.signif <- ifelse(pv.final$p.adjust > 0.05, "", ifelse(pv.final$p.adjust > 0.01,"*", "**"))
# subset
G <- pv.final$p.adjust <= 0.05
CNb[G]
P <- ggplot(mydf,aes(x=both, y=value)) +
geom_boxplot(aes(fill=Species)) +
facet_grid(~Species, scales="free", space="free_x") +
theme(axis.text.x = element_text(angle=45, hjust=1)) +
geom_signif(test="wilcox.test", comparisons = combn(levels(mydf$both),2, simplify = F),
map_signif_level = F,
vjust=0.5,
textsize=4,
size=0.5,
step_increase = 0.06)
P2 <- ggplot_build(P)
#pv.final$map.signif <- "" #UNCOMMENT THIS LINE TO MOCK A CASE WHERE THERE ARE NO SIGNIFICANT COMPARISONS
#pv.final$map.signif[c(1:42,44:80,82:84)] <- "" #UNCOMMENT THIS LINE TO MOCK A CASE WHERE THERE ARE JUST A COUPLE OF SIGNIFICANT COMPARISONS
P2$data[[2]]$annotation <- rep(pv.final$map.signif, each=3)
# remove non significants
P2$data[[2]] <- P2$data[[2]][P2$data[[2]]$annotation != "",]
# and the final plot
png(filename="test.png", height=800, width=800)
plot(ggplot_gtable(P2))
dev.off()
这会产生这个情节:
上面的情节正是我想要的......但我面临的情况是没有重要的比较,或者很少。在这些情况下,很多垂直空间都是空的。
为了举例说明这些场景,我们可以取消注释该行:
pv.final$map.signif <- "" #UNCOMMENT THIS LINE TO MOCK A CASE WHERE THERE ARE NO SIGNIFICANT COMPARISONS
所以当没有重要的比较时,我会得到这个情节:
如果我们取消注释另一行:
pv.final$map.signif[c(1:42,44:80,82:84)] <- "" #UNCOMMENT THIS LINE TO MOCK A CASE WHERE THERE ARE JUST A COUPLE OF SIGNIFICANT COMPARISONS
我们在一个只有几个显着比较的情况下,得到这个图:
所以我的问题是:
如何将垂直空间调整为显着比较的个数,这样就没有垂直空间了?
在step_increase 或geom_signif() 内的y_position 中可能有一些东西我可以更改,所以我只为CNb[G] 中的重要比较留出空间...
【问题讨论】:
-
看来您引用的第一个链接中的最后一个示例确实/显示了您想要的内容,所以为什么不将您的示例简化为类似的内容,看看您是否可以重现该数字然后建立备份到您的完整数据?
-
事实并非如此......在那个链接中,答案不会隐藏不重要的比较,这就是为什么我需要在情节之外进行测试然后更改情节的注释(如@ 987654326@)
-
但是你正在做一些事情......就像我提供的第一个链接一样,我可能可以在
geom_signif()内做comparisons=CNb[G]......这只会为重要的比较留出空间...让我试着回复你 -
@DaniCee 没用,我试过了 :(
-
到目前为止我没有尝试过任何工作......你们中的任何人都有线索吗?谢谢!