如何按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
报错原因
melt时未包含species作为ID列:原代码仅将Sample设为id变量,导致转换后的pcm数据框缺失species列,facet_wrap(~species)无法找到该变量。- 重复调用柱状图层:同时使用
geom_bar(stat="identity")和geom_col(),二者功能重复(geom_col等价于stat="identity"的geom_bar)。 - 列名替换逻辑冗余:全局替换所有列名的下划线会干扰后续分面字段的识别,且无需修改非标签类列名。
修正后的代码
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
相关产品推荐
相关产品推荐

