如何在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
相关产品推荐
相关产品推荐

