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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:39:01