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

如何绘制按门级着色带梯度的微生物组堆叠柱状图

微生物组堆叠柱状图按门级配色解决方案

步骤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:05:02