如何修改stat_n_text函数的显示值以适配配对前后测数据的样本量标注
解决方案
你可以通过两种方式实现需求,优先推荐第一种可控性更高,无需修改原函数源码:
方案1:手动计算样本量后用geom_text标注
配对设计下优先基于受试者唯一ID去重计数,没有ID时可以直接将组内计数除以2,完整代码如下:
library(ggplot2) library(tidyverse) cars_pre= mtcars %>% mutate(time="Pre") cars_post= mtcars %>% mutate(time="Post") df= rbind(cars_pre,cars_post) # 预计算每个cyl分组的样本量和标注位置 n_anno <- df %>% group_by(cyl) %>% # 若有受试者ID列替换为n = n_distinct(受试者ID)更稳妥 summarise(n = n()/2, # 标注位置设置为该组mpg最大值上方1个单位,可自行调整 anno_y = max(mpg) + 1) ggplot(df, aes(factor(cyl), mpg)) + geom_boxplot(aes(fill = time)) + # 替换原stat_n_text(),手动传入标注数据 geom_text(data = n_anno, aes(x = factor(cyl), y = anno_y, label = paste0("n=", n)), inherit.aes = FALSE)
运行后会在对应分组上方标注对应n值(注:mtcars原始cyl分组为4、6、8,若你的实际数据为4、5、6只需按上述逻辑计算即可)。
方案2:修改stat_n_text的取值逻辑
如果需要直接修改原函数的计数逻辑,可以自定义继承自stat_n_text的统计层,重写分组计数逻辑:
library(EnvStats) # 自定义配对设计样本量标注函数 stat_n_text_paired <- function(adjust_factor = 2, ...) { # 继承原stat_n_text,修改分组计数的计算逻辑 layer <- stat_n_text(...) original_compute <- layer$compute_group layer$compute_group <- function(data, scales) { res <- original_compute(data, scales) # 计数除以调整因子,默认2对应前后测配对设计 res$label <- paste0("n=", round(as.numeric(gsub("n=","",res$label))/adjust_factor)) return(res) } return(layer) } # 绘图时直接调用自定义函数即可 ggplot(df, aes(factor(cyl), mpg)) + geom_boxplot(aes(fill = time)) + stat_n_text_paired()
注:若你的数据存在部分受试者缺失后测/前测的情况,务必使用受试者ID去重计数,不要直接硬编码除以2,避免标注数值错误。
内容的提问来源于stack exchange,提问作者yuliaUU
相关产品推荐
相关产品推荐

