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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:16:04