如何用ggplot绘制基于两列的分组堆叠组合柱状图?
合并深度/长度分组的堆叠柱状图解决方案
要实现同一Abbreviation下,相机部署深度(Depth_groups)和物种长度(Length_Groups)的堆叠柱状图分组并排,核心是先把数据从宽格式转成长格式,将两类分组整合到同一维度,再通过position_dodge实现分组效果。以下是完整实现步骤:
1. 数据重塑
使用tidyr::pivot_longer将Length_Groups和Depth_groups合并为一个分组列,同时新增Group_Type列标记分组类别(长度/深度):
library(dplyr) library(ggplot2) library(ggh4x) library(forcats) library(tidyr) library(viridis) # 数据重塑:整合长度和深度分组 df_long <- df |> ungroup() |> pivot_longer( cols = c(Length_Groups, Depth_groups), names_to = "Group_Type", values_to = "Category" ) |> # 保持原Abbreviation排序逻辑 mutate( Abbreviation = fct_reorder(Abbreviation, ifelse(!Water_Type %in% "Saltwater", 0, total), .fun = sum ), # 重命名Group_Type为更友好的标签 Group_Type = factor(Group_Type, levels = c("Depth_groups", "Length_Groups"), labels = c("Camera Deployment Depth", "Tagged Species Length")) )
2. 绘制合并后的分组堆叠柱状图
利用position_dodge让同一Abbreviation下的两类堆叠柱状图并排,同时保留Water_Type的分面,样式延续原代码的设置:
combined_plot <- df_long |> ggplot(aes(x = Abbreviation, y = total, fill = Category, group = Group_Type)) + # 堆叠+分组:position_dodge实现并排,内部堆叠 geom_col(position = position_dodge(width = 0.8), width = 0.7) + # 针对两类分组设置统一颜色系(保持原viridis风格) scale_fill_viridis(discrete = TRUE, option = "plasma", direction = -1, end = 0.75, # 自定义图例标签,对应两类分组的所有类别 labels = c( "Surface to 3m", "3m to 40m", ">40m", "Not Reported", "Small (<24cm)", "Medium (24-140cm)", "Large (>140cm)", "Not Reported" )) + scale_y_continuous(expand = c(0, 0)) + theme_classic() + # 保留Water_Type分面,延续原布局 facet_wrap2(~Water_Type, ncol = 1, axes = "all", remove_labels = "all") + # 样式设置与原代码一致 theme( axis.text.x = element_text(size = 12, angle = 45, hjust = 1), axis.text.y = element_text(size = 12), axis.title.x = element_text(size = 1.2, margin = margin(15, 0, 0, 0)), axis.title.y = element_text(size = 12, margin = margin(0, 25, 0, 0)), legend.title = element_text(size = 12), legend.text = element_text(size = 12), panel.spacing = unit(1.5, "lines"), strip.background = element_blank(), strip.text.x = element_text(size = 12), plot.margin = margin(1, 0, 1.5, 4, "cm") ) + labs( y = "Total Number of Manuscripts", fill = "Category", x = "Medium-Scale Device Pairings" ) + # 调整图例,按分组类型归类显示 guides(fill = guide_legend(ncol = 2, title.position = "top")) combined_plot
关键说明
pivot_longer:将原本独立的两列分组数据整合,让ggplot能同时处理两类堆叠逻辑。position_dodge(width = 0.8):控制同一Abbreviation下两个柱状图的间距,确保分组清晰。- 图例优化:通过自定义标签匹配两类分组的类别,并用
guide_legend拆分布局,避免图例混乱。
内容的提问来源于stack exchange,提问作者Kristen Cyr
相关产品推荐
相关产品推荐

