如何用ggpubr绘制带显著性星号与指定Y轴的分组柱状图
用ggpubr绘制带显著性标记的分组柱状图及Y轴设置方案
1. 加载依赖包
先安装并加载ggpubr及配套统计包rstatix:
install.packages(c("ggpubr", "rstatix")) # 首次运行执行安装 library(ggpubr) library(rstatix)
2. 数据准备(替换为你的df_ss)
以下是模拟的同结构示例数据,直接替换成你实际的df_ss即可:
# 模拟数据:group为处理组,value为观测指标 set.seed(123) df_ss <- data.frame( group = rep(c("处理组1", "处理组2", "处理组3", "处理组4"), each = 10), value = c(rnorm(10, 30, 5), rnorm(10, 50, 6), rnorm(10, 70, 7), rnorm(10, 25, 4)) )
3. 统计检验与显著性位置计算
先做单因素方差分析,再用Tukey法完成处理组两两比较,并自动计算显著性标记的坐标位置:
# 单因素方差分析 anova_res <- anova_test(data = df_ss, dv = value, between = group) # 两两比较并生成标记位置信息 pwc <- df_ss %>% tukey_hsd(value ~ group) %>% add_xy_position(x = "group")
4. 绘制柱状图并添加显著性标记、设置Y轴
以下代码一次性完成柱状图绘制、显著性星号添加、Y轴范围(0-100)和步长(10)的设置:
ggbarplot(df_ss, x = "group", # X轴绑定处理组 y = "value", # Y轴绑定观测指标 fill = "group", # 按处理组填充颜色 palette = "jco", # 可选配色,也可自定义如c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3") add = "mean_se", # 添加均值+标准误 error.plot = "errorbar") + # 误差线样式 # 添加两两比较显著性星号(ns=无差异, *=p<0.05, **=p<0.01, ***=p<0.001) stat_pvalue_manual(pwc, label = "p.signif", tip.length = 0.01) + # 设置Y轴范围0-100,步长10 scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, 10)) + labs(title = "处理组间指标差异比较", x = "处理组", y = "指标值") + theme_pubr() # 使用ggpubr简洁主题
5. 常见问题排查
- 报错找不到
add_xy_position:确认已加载rstatix包,该函数由rstatix提供,必须安装并加载。 - 显著性标记位置偏移:可在
stat_pvalue_manual中手动指定y.position参数,比如y.position = c(35, 55, 75, 32),根据你的数据均值调整。 - Y轴设置不生效:检查是否有
coord_cartesian图层覆盖了scale_y_continuous,若有则移除,或改用coord_cartesian(ylim = c(0,100))配合scale_y_continuous(breaks = seq(0,100,10))。 - 双分组柱状图(如处理组+时间点):参考以下代码调整:
# 双分组示例数据 df_ss2 <- data.frame( treatment = rep(c("处理A", "处理B"), each = 20), time = rep(c("T1", "T2"), each = 10, times = 2), value = c(rnorm(10, 25, 4), rnorm(10, 35, 5), rnorm(10, 45, 6), rnorm(10, 60, 7)) ) # 双分组两两比较 anova_res2 <- anova_test(data = df_ss2, dv = value, between = c(treatment, time)) pwc2 <- df_ss2 %>% tukey_hsd(value ~ treatment:time) %>% add_xy_position(x = "treatment", group = "time") # 双分组柱状图绘制 ggbarplot(df_ss2, x = "treatment", y = "value", fill = "time", palette = "npg", add = "mean_se", error.plot = "errorbar", position = position_dodge(0.8)) + stat_pvalue_manual(pwc2, label = "p.signif", position = position_dodge(0.8), tip.length = 0.01) + scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, 10)) + theme_pubr()
内容的提问来源于stack exchange,提问作者Kiplagat Noel
相关产品推荐
相关产品推荐

