ggplot泳道图按分组变量排序Y轴并添加分组标签
按group排序Y轴并添加侧边分组标签的解决方案
1. 预处理数据:调整subject的因子顺序
要让Y轴按group分组排序,首先需要把subject转换为有序因子,确保同一group的subject集中排列:
# 提取每个subject对应的唯一group,按group+subject排序 subject_order <- dataset %>% distinct(subject, group) %>% arrange(group, subject) # 将subject转为因子,水平顺序按上述排序结果设置 dataset$subject <- factor(dataset$subject, levels = subject_order$subject)
2. 绘制带分组标签的泳道图
方法一:用ggh4x包快速实现侧边分组标签(推荐)
ggh4x的facet_grid2可以在Y轴左侧自动添加分组标签,且不会拆分图表面板:
# 先安装并加载包 install.packages("ggh4x") library(ggh4x) ggplot(dataset, aes(x = diff + 1, y = subject, group = p)) + geom_col(aes(fill = as.factor(exdose)), position = position_stack(reverse = TRUE)) + # 左侧添加分组标签,不拆分Y轴刻度 facet_grid2(group ~ ., scales = "free_y", space = "free_y", strip = strip_position("left")) + # 优化标签样式 theme(strip.text.y.left = element_text(angle = 0, hjust = 1, size = 10), strip.background.y = element_rect(fill = "#f0f0f0")) + labs(fill = "exdose")
方法二:无需额外包,手动添加分组标签
如果不想安装新包,可以手动计算分组位置,用annotate添加标签和背景:
# 计算每个group对应的Y轴位置范围 group_ranges <- subject_order %>% group_by(group) %>% summarise( y_low = min(as.integer(subject)) - 0.5, y_high = max(as.integer(subject)) + 0.5 ) ggplot(dataset, aes(x = diff + 1, y = subject, group = p)) + geom_col(aes(fill = as.factor(exdose)), position = position_stack(reverse = TRUE)) + # 添加分组背景色块 annotate("rect", xmin = -Inf, xmax = -0.5, ymin = group_ranges$y_low, ymax = group_ranges$y_high, fill = c("#e6f2ff", "#f2ffe6"), alpha = 0.3) + # 添加分组文字标签 annotate("text", x = -1, y = (group_ranges$y_low + group_ranges$y_high)/2, label = group_ranges$group, fontface = "bold") + # 调整X轴范围,给标签留出空间 xlim(-2, max(dataset$diff + 1) + 1) + labs(fill = "exdose")
两种方法都能实现:
- Y轴subject按group分组排列,同一组内按subject编号排序
- 左侧显示清晰的分组标识
内容的提问来源于stack exchange,提问作者BobbyPP
相关产品推荐
相关产品推荐

