如何用R动态生成含下标与男女样本量的ggplot X轴刻度标签
解决ggplot拆分小提琴图X轴合并男女样本量标签的方案
核心思路
先按分类+性别统计样本量,将男女样本量的表达式合并为单个刻度标签,最后替换X轴原有刻度。
完整代码示例
1. 准备环境与数据
library(ggplot2) library(ggstance) # 用于绘制拆分小提琴图 library(dplyr) library(tidyr) # 构造示例数据 set.seed(123) df <- tibble( group = rep(c("Group1", "Group2", "Group3", "Group4"), each = 20), gender = rep(c("Female", "Male"), 40), value = rnorm(80, mean = rep(c(5, 7, 6, 8), each = 20), sd = 1) )
2. 统计各分类下的男女样本量
sample_counts <- df %>% group_by(group, gender) %>% summarise(n = n(), .groups = "drop") %>% pivot_wider(names_from = gender, values_from = n) %>% arrange(group) # 确保分组顺序与X轴原始分类一致
3. 构建合并的刻度表达式向量
# 遍历每个分组的男女样本量,生成合并后的表达式 x_labels <- mapply( function(f, m) { bquote(f[italic(n)] == .(f) ~ "," ~ m[italic(n)] == .(m)) }, f = sample_counts$Female, m = sample_counts$Male, SIMPLIFY = FALSE ) %>% do.call(expression, .) # 转换为ggplot可识别的expression向量
4. 绘图并替换X轴标签
ggplot(df, aes(x = group, y = value, fill = gender)) + geom_split_violin(scale = "area") + scale_x_discrete(labels = x_labels) + labs(x = "分组", y = "数值", fill = "性别") + theme_classic()
关键说明
bquote中用.()插入动态样本量,~用于连接两个表达式,实现同一刻度内同时展示男女样本量- 必须将生成的表达式列表转换为
expression向量,才能被scale_x_discrete识别 - 确保
sample_counts的分组顺序与X轴原始分类顺序一致,避免标签错位
内容的提问来源于stack exchange,提问作者sofia
相关产品推荐
相关产品推荐

