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

求助:用R绘制带堆叠颜色的堆叠图并添加侧边注释

实现带侧边注释的堆叠图(R语言)

1. 数据预处理

先将原始分号分隔的宽格式数据转换为ggplot2适配的长格式:

library(tidyverse)

# 导入原始数据
df <- tribble(
  ~Category, ~Sam1, ~Sam2, ~Sam3,
  "Cat1", "A", "B;C", "C",
  "Cat2", "B", "A", "A;B",
  "Cat3", "A;C", "C", "A;B;C",
  "Cat4", "B", "A", "C"
)

# 拆分分号取值,转为长格式
tidy_df <- df %>%
  pivot_longer(cols = starts_with("Sam"), names_to = "Sample", values_to = "Value") %>%
  separate_rows(Value, sep = ";") %>%
  mutate(Value = factor(Value, levels = c("A", "B", "C")))

2. 定义分组与注释规则

根据需求给每个类别绑定分组和注释信息,示例规则:Cat1、Cat2归为G1(注释D1),Cat3、Cat4归为G2(注释D2):

group_info <- tibble(
  Category = c("Cat1", "Cat2", "Cat3", "Cat4"),
  Group = c("G1", "G1", "G2", "G2"),
  Annotation = c("D1", "D1", "D2", "D2")
)

# 合并注释信息到长格式数据
tidy_df <- tidy_df %>% left_join(group_info, by = "Category")

3. 绘制带侧边注释的堆叠图

方法1:基础ggplot2实现侧边文本注释

# 定义A/B/C的颜色映射
color_pal <- c("A" = "#1f77b4", "B" = "#ff7f0e", "C" = "#2ca02c")

# 绘制堆叠图主体
base_plot <- ggplot(tidy_df, aes(x = Sample, y = 1, fill = Value)) +
  geom_col(position = "fill", color = "white") + # 按比例堆叠
  facet_grid(Category ~ ., switch = "y") + # 按类别纵向分面,标签移至左侧
  scale_fill_manual(values = color_pal) +
  scale_y_continuous(expand = c(0, 0)) +
  theme_minimal() +
  theme(
    strip.text.y.left = element_text(angle = 0), # 左侧类别标签水平显示
    panel.spacing = unit(0, "lines"), # 分面间无间距
    axis.title.y = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    panel.grid = element_blank()
  )

# 添加侧边分组与注释文本
base_plot +
  geom_text(
    data = group_info %>% distinct(Group, Annotation, Category),
    aes(x = -0.3, y = 0.5, label = Annotation),
    inherit.aes = FALSE,
    size = 4,
    fontface = "bold"
  ) +
  geom_text(
    data = group_info %>% distinct(Group, Annotation, Category),
    aes(x = -0.5, y = 0.5, label = Group),
    inherit.aes = FALSE,
    size = 3,
    color = "gray50"
  )

方法2:用ggside包实现更规范的侧边面板注释

如果需要更灵活的侧边布局,可使用ggside包:

library(ggside)

ggplot(tidy_df, aes(x = Sample, y = 1, fill = Value)) +
  geom_col(position = "fill", color = "white") +
  facet_grid(Category ~ ., switch = "y") +
  scale_fill_manual(values = color_pal) +
  scale_y_continuous(expand = c(0, 0)) +
  theme_minimal() +
  theme(
    strip.text.y.left = element_text(angle = 0),
    panel.spacing = unit(0, "lines"),
    axis.title.y = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    panel.grid = element_blank()
  ) +
  geom_ysidetext(
    data = group_info %>% distinct(Group, Annotation, Category),
    aes(y = Category, label = Annotation),
    x = -0.1,
    size = 4,
    fontface = "bold"
  ) +
  geom_ysidetext(
    data = group_info %>% distinct(Group, Annotation, Category),
    aes(y = Category, label = Group),
    x = -0.2,
    size = 3,
    color = "gray50"
  )

自定义调整说明

  • 可修改group_info中的分组规则,适配你的实际注释需求
  • color_pal可替换为你需要的配色方案
  • 注释文本的x坐标可根据绘图宽度调整,确保显示在侧边合适位置

内容的提问来源于stack exchange,提问作者nod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:11:28