求助:用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
相关产品推荐
相关产品推荐

