微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在具有自由比例的小平面下的 stat_compare_means() 中自动分配 label.y 位置不同的 y 高度

如何解决如何在具有自由比例的小平面下的 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 测试线是相同的。

enter image description here

如何针对自由 y-scale 的不同方面自动调整它?

这条线似乎不起作用:

 label.y = c(seq( 0.456,length.out = 4))

我们可以预先计算每个基因的最大均值在这个范围内:0.4561404 0.1250000

解决方法

这可能是完成任务的一种方式:

结果图:

enter image description here

代码

# 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

然后我决定应用一个解决方法:这是一个想法:

  1. 为每个基因创建一个单独的图,并通过过滤 dat1 gene1dat2 gene2
  2. 这里的挑战是调整 ylim,最后我通过这段代码实现了这一点
coord_cartesian(ylim=c(0,0.1))
  1. 现在您可以通过将 stat_compare_means 更改为 ..c(seq(0.3 等来单独更改 ..c(seq(0.4 的位置。

  2. 最后,您可以将两个图与 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

它产生:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。