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

如何按Species列将堆叠柱状图分为3列并修复分面报错

堆叠柱状图绘制问题解决方案

问题背景

数据集data_for_plot.csv结构如下:

Sample,Cyanobacteria,Rhodophyta,Unknown_phylum,Chlorophyta,Bacillariophyta,Cercozoa,Apicomplexa,Unclassified,Streptophyta,species
S047424,18.8176,10.2027,21.6216,28.8514,0,16.3851,0,4.12162,0,SpeciesName1
S047423,26.3215,22.8883,17.4932,22.8883,1.3624,5.61308,0,3.43324,0,SpeciesName1
S047422,41.305,1.91199,14.5372,39.5751,0,0.971168,0,1.69954,0,SpeciesName1
S047420,98.2477,0,1.75232,0,0,0,0,0,0,SpeciesName2
S047419,19.6175,0,42.3893,37.9932,0,0,0,0,0,SpeciesName2
S047418,45.9008,0,0,0,0,54.0992,0,0,0,SpeciesName2
S047417,0.801603,8.01603,67.4349,3.00601,19.2385,1.50301,0,0,0,SpeciesName2
S047404,10.0267,58.2888,23.262,2.31729,2.94118,3.16399,0,0,0,SpeciesName3
S047402,1.67364,70.9044,11.2649,0,11.0074,0,0,5.14966,0,SpeciesName3
S047400,25.9087,27.959,31.8733,0,9.13327,5.12582,0,0,0,SpeciesName3

需求:按species列拆分绘制堆叠柱状图,3个物种各占独立分面,且物种标签需去除下划线。运行代码后报错:At least one layer must contain all faceting variables:species

报错原因

  1. melt时未包含species作为ID列:原代码仅将Sample设为id变量,导致转换后的pcm数据框缺失species列,facet_wrap(~species)无法找到该变量。
  2. 重复调用柱状图层:同时使用geom_bar(stat="identity")和geom_col(),二者功能重复(geom_col等价于stat="identity"的geom_bar)。
  3. 列名替换逻辑冗余:全局替换所有列名的下划线会干扰后续分面字段的识别,且无需修改非标签类列名。

修正后的代码

library(ggplot2)
library(reshape2)
library(tidyverse)

# 读取数据集
pc <- read.csv("data_for_plot.csv", header = TRUE)

# 单独处理物种标签的下划线(替换为空格)
pc$species <- gsub("_", " ", pc$species)

# 宽表转长表:保留Sample和species作为ID列,确保分面变量存在
pcm <- melt(pc, id = c("Sample", "species"))

# 设置Sample的显示顺序为原始数据中的出现顺序
pcm$Sample <- factor(pcm$Sample, levels = unique(pcm$Sample))

# 绘制堆叠柱状图
mx <- ggplot(pcm, aes(x = Sample, fill = variable, y = value)) + 
  geom_col(colour = "black") +  # 用geom_col替代重复的geom_bar
  theme(
    axis.text.x = element_text(angle = 90, size = 8, colour = "black", vjust = 0.5, hjust = 1, face = "bold"),
    axis.title.y = element_text(size = 16, face = "bold"),
    legend.title = element_text(size = 16, face = "bold"),
    legend.text = element_text(size = 12, face = "bold", colour = "black"),
    axis.text.y = element_text(colour = "black", size = 12, face = "bold")
  ) + 
  scale_y_continuous(expand = c(0, 0)) + 
  labs(x = "", y = "Relative Abundance (%)", fill = "Phylum") +
  facet_wrap(~species)  # 现在pcm包含species列,可正常分面

# 输出图形
print(mx)

关键修正点说明

  • 保留分面字段:melt时将Sample和species同时设为id变量,确保转换后的长表包含分面所需的species字段。
  • 精准处理标签:单独针对species列替换下划线,既满足标签显示需求,又不影响其他字段的识别。
  • 简化图层调用:删除重复的geom_bar调用,用geom_col统一实现堆叠柱状图效果。

内容的提问来源于stack exchange,提问作者Rodriguez J Mathew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:39:35