如何绘制按门级着色带梯度的微生物组堆叠柱状图
微生物组堆叠柱状图按门级配色解决方案
步骤1:关联分类信息到重塑后的数据
将melt后的宽表数据与门-科对应表合并,让每个科(variable列)都带上所属门的信息:
# 合并分类映射 df_melt <- merge(df_melt, df_taxa, by.x = "variable", by.y = "Family", all.x = TRUE)
all.x=TRUE会自动过滤掉数据中不存在的科(比如示例里的Family1、Family2)。
步骤2:自定义门级梯度色生成函数
实现函数为每个门分配基础色,下属科生成该基础色的连续梯度:
ColourPalleteMulti <- function(df, phylum_col, family_col) { # 为每个门指定基础主色(可自行替换) phylum_base_cols <- c("Phyla1" = "#1f77b4", "Phyla2" = "#ff7f0e", "Phyla3" = "#2ca02c") # 按门分组,为每组科生成梯度色 color_list <- lapply(split(df, df[[phylum_col]]), function(sub_df) { family_count <- nrow(sub_df) # 生成从基础色到白色的梯度,可改为深色梯度如c("white", phylum_base_cols[...]) colorRampPalette(c(phylum_base_cols[unique(sub_df[[phylum_col]])], "white"))(family_count) }) # 转换为科-颜色的映射向量 unlist(color_list) } # 仅针对数据中存在的科生成颜色 target_taxa <- df_taxa[df_taxa$Family %in% df_melt$variable, ] df_cols <- ColourPalleteMulti(target_taxa, "Phylum", "Family")
步骤3:按门级排序并绘图
先按门对科排序,确保同门科在堆叠柱中聚集,再绘图:
library(reshape2) library(ggplot2) library(ggforce) # 加载facet_grid_paginate所需包 # 按门和科排序,保证同门科堆叠在一起 df_melt <- df_melt[order(df_melt$Phylum, df_melt$variable), ] ggplot(df_melt, aes(x = ID, y = value, fill = variable, group = interaction(Phylum, variable))) + geom_bar(position = "fill", stat = "identity") + scale_fill_manual("", values = df_cols) + facet_grid_paginate(. ~ Group, scales = "free_x") + labs(y = "相对丰度") + theme_bw()
核心逻辑说明
- 分类信息关联是基础:必须让每条数据都带上所属门的标签,才能实现按门配色和分组
- 梯度色可灵活调整:修改
phylum_base_cols更换门的主色,调整colorRampPalette的颜色参数改变梯度方向(比如从浅到深) - 排序不可省略:不按门排序的话,同门科会分散在堆叠柱中,无法实现视觉上的门级分组效果
内容的提问来源于stack exchange,提问作者btredcup
相关产品推荐
相关产品推荐

