You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot2中基于viroid和expression分组进行统计分析?

问题描述

我正在对一份数据集进行统计分析,该数据集的viroid列包含PSTVd与TPMVd两个取值,expression列包含Up-regulated与Down-regulated两个取值。我已编写如下ggplot2代码绘制箱线图:

ggplot(Both_DEGs, aes(x=Viroid, y=Log2FC, fill=Expression)) +
  geom_boxplot()+
  theme(axis.text.x=NULL)+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"))+
  stat_compare_means(label = "p.format", 
                     label.x = 1.32, label.y = 18, method = "t.test", paired = F)+
  ggtitle("Expression ranges")+
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))

当前生成的箱线图已按Viroid和Expression分为四组,我希望完成两组对比统计分析:PSTVd - Up-regulated vs TPMVd - Up-regulated、PSTVd - Down-regulated vs TPMVd - Down-regulated,请问该如何实现?

解决方案

你可以通过修改stat_compare_means的参数,指定按Expression分组执行统计检验,同时调整标签位置与箱线组对齐,具体有两种实现方案:

方案1:同一图内分组标注检验结果

修改原代码,添加group = Expression让检验按上调/下调组分别执行,同时用position_dodge让标签与对应箱线对齐:

library(ggplot2)
library(ggpubr)

ggplot(Both_DEGs, aes(x = Viroid, y = Log2FC, fill = Expression)) +
  geom_boxplot(position = position_dodge(width = 0.75)) + # 显式设置箱线的分组间距
  theme(axis.text.x = NULL) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black")) +
  stat_compare_means(label = "p.format", 
                     group = Expression, # 按Expression分组执行t检验
                     position = position_dodge(width = 0.75), # 标签与箱线组对齐
                     label.x = c(1.2, 1.2), # 两组标签的x坐标
                     label.y = c(18, 16), # 两组标签的y坐标,避免重叠
                     method = "t.test", 
                     paired = FALSE) +
  ggtitle("Expression ranges") +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))

方案2:分面图分离两组对比

如果担心标签重叠,也可以用facet_wrap将上调和下调组拆分为两个子图,每个子图内直接对比两种Viroid的差异:

library(ggplot2)
library(ggpubr)

ggplot(Both_DEGs, aes(x = Viroid, y = Log2FC, fill = Viroid)) +
  geom_boxplot() +
  facet_wrap(~Expression) + # 按Expression分面
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black")) +
  stat_compare_means(label = "p.format", 
                     method = "t.test", 
                     paired = FALSE) +
  ggtitle("Expression ranges") +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))

两种方案都能实现你需要的分组统计对比,可根据可视化需求选择。

内容的提问来源于stack exchange,提问作者OctavioZM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:21:02