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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:57:31