如何解决如何在具有自由比例的小平面下的 stat_compare_means() 中自动分配 label.y 位置不同的 y 高度
我有以下数据框:
library(tidyverse)
library(ggpubr)
dat <- structure(list(genes = c("Gene1","Gene2","Gene1","Gene1"
),gexp = c(0,1,2,3,4,6,0),GROUP = c("Bc_Lin+","Hd_Lin-","Hd_Lin+","Tl_Lin-","Bc_Lin-","Ab_Lin-","Bc_Lin+","Ab_Lin+","Tl_Lin+","Ab_Lin-")),row.names = c(NA,-732L),class = c("tbl_df","tbl","data.frame"))
我想要的是在 GROUP 列之间进行统计比较。 这是我的代码
sort_order <- c("Hd_Lin+","Tl_Lin-")
dat <- dat %>%
mutate(GROUP = factor(GROUP,levels = sort_order))
my_comparison <- list(
c("Hd_Lin+","Hd_Lin-"),c("Ab_Lin+","Ab_Lin-"),c("Bc_Lin+","Bc_Lin-"),c("Tl_Lin+","Tl_Lin-"))
ggpubr::ggbarplot(dat,x = "GROUP",y = "gexp",add = "mean_se",facet.by = "genes",scales = "free") +
stat_compare_means(aes(label = ..p.signif..),label.y = c(seq( 0.456,by = 0,length.out = 4),seq( 0.125,length.out = 4)),tip.length = 0,vjust = 0.5,method = "t.test",comparisons = my_comparison) +
theme(axis.text.x=element_text(angle = 90,hjust = 1,size = 12)) +
xlab("")
正如您在下图中注意到的,Gene1 和 Gene2 的 stat 测试线是相同的。
如何针对自由 y-scale 的不同方面自动调整它?
这条线似乎不起作用:
label.y = c(seq( 0.456,length.out = 4))
我们可以预先计算每个基因的最大均值在这个范围内:0.4561404 0.1250000
。
解决方法
这可能是完成任务的一种方式:
结果图:
代码
# your data
sort_order <- c("Hd_Lin+","Hd_Lin-","Ab_Lin+","Ab_Lin-","Bc_Lin+","Bc_Lin-","Tl_Lin+","Tl_Lin-")
dat <- dat %>%
mutate(GROUP = factor(GROUP,levels = sort_order))
my_comparison <- list(
c("Hd_Lin+","Hd_Lin-"),c("Ab_Lin+","Ab_Lin-"),c("Bc_Lin+","Bc_Lin-"),c("Tl_Lin+","Tl_Lin-"))
library(ggpubr)
library(tidyverse)
# data for Gene1
dat1 <- dat %>%
filter(genes=="Gene1")
# date for Gene2
dat2 <- dat %>%
filter(genes=="Gene2")
# plot p1
p1 <- ggpubr::ggbarplot(dat1,x = "GROUP",y = "gexp",add = "mean_se",facet.by = "genes",scales = "free") +
stat_compare_means(aes(label = ..p.signif..),label.y = c(seq( 0.3,by = 0,length.out = 4)),tip.length = 0,vjust = 0.5,method = "t.test",comparisons = my_comparison) +
theme(axis.text.x=element_text(angle = 90,hjust = 1,size = 12)) +
xlab("") +
coord_cartesian(ylim=c(0,0.6)) +
scale_y_continuous(breaks = seq(0,0.5,0.1),labels = seq(0.1,0.6,0.1))
# plot p2
p2 <- ggpubr::ggbarplot(dat2,label.y = c(seq( 0.6,0.1))
ggarrange(p1,p2,heights = c(4,4),nrow = 1,align = "h")
说明
我尝试在 facet 中访问 label.y,但失败了。请参阅此处https://github.com/kassambara/ggpubr/issues/50。
然后我决定应用一个解决方法:这是一个想法:
- 为每个基因创建一个单独的图,并通过过滤
dat1
gene1
和dat2
gene2
。 - 这里的挑战是调整
ylim
,最后我通过这段代码实现了这一点
coord_cartesian(ylim=c(0,0.1))
-
现在您可以通过将
stat_compare_means
更改为..c(seq(0.3
等来单独更改..c(seq(0.4
的位置。 -
最后,您可以将两个图与
ggarrange
包中的ggpubr
结合
试试这个。它适用于任何数量的基因。没有硬编码:
library(rstatix)
sort_order <- c(
"Hd_Lin+","Tl_Lin-"
)
my_comparisons <- list(
c("Hd_Lin+","Tl_Lin-")
)
dat <- dat %>%
mutate(GROUP = factor(GROUP,levels = sort_order))
stat.test <- dat %>%
group_by(genes) %>%
t_test(gexp ~ GROUP,p.adjust.method = "none") %>%
add_xy_position(x = "GROUP",fun = "mean_se",scales = "free",comparisons = my_comparisons,step.increase = 0) %>%
mutate(p.adj.signif = if_else(p.adj.signif == "","NS.",p.adj.signif))
p <- ggpubr::ggbarplot(dat,facet = "genes",scales = "free"
) +
stat_pvalue_manual(stat.test,hide.ns = FALSE,bracket.nudge.y = 0.01) +
# scale_y_continuous(expand = expansion(mult = c(0.05,0.5))) +
theme(strip.text.x = element_text(size = 20,colour = "black",face = "bold")) +
theme(legend.position = "none") +
xlab("") +
theme(axis.text.x = element_text(angle = 90,vjust = 0.5))
p
它产生:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。