ggplot2 geom_bar position='dodge'不生效问题排查请求
问题排查与解决方案
核心错误原因
数据结构不匹配并列需求
你提供的6行数据中,每个ASV_numbers仅对应单个Group的记录,不存在同一ASV在多个Group下的LDA值。而position="dodge"的作用是在同一分类位置下,将不同组的条形并列,没有同ASV跨组的重复数据,自然无法触发并列效果。变量映射逻辑错误
当前代码将连续型变量LDA设为x轴,分类变量ASV_numbers设为y轴。这种映射下,每个条形的x位置由LDA数值决定,每个条形的位置都是唯一的,group=Group无法找到可并列的同位置条形,dodge设置无效。
修正方案
步骤1:调整变量映射逻辑
要实现每个ASV行内不同Group的条形并列,需将分类变量Group设为x轴,LDA设为y轴,再通过coord_flip()转为横向显示(匹配你原需求的y轴ASV布局)。
步骤2:补全跨组的ASV数据(关键)
使用tidyr::complete()补全所有ASV_numbers和Group的组合,缺失的LDA值可设为0(或根据需求设为NA),确保每个ASV在所有Group下都有记录。
完整修正代码
library(ggplot2) library(tidyr) # 补全ASV与Group的所有组合,缺失LDA填充为0 lda_lawn_complete <- lda_lawn %>% complete(ASV_numbers, Group, fill = list(LDA = 0)) # 绘制分组并列条形图 ggplot(lda_lawn_complete, aes(x = Group, y = LDA, fill = Group)) + geom_col(position = "dodge") + coord_flip() + facet_grid(ASV_numbers ~ ., scales = "free_y", space = "free_y") + theme(axis.text.y = element_text(size = 8))
代码说明
complete():生成所有ASV和Group的笛卡尔积,缺失的LDA用0填充,保证每个ASV在4个Group下都有数据。coord_flip():将x/y轴翻转,让ASV显示在y轴,Group显示在x轴(横向条形)。facet_grid():按ASV分面,每个ASV单独一行,避免不同ASV的条形重叠,同时scales="free_y"自动适配每个ASV的y轴空间。
内容的提问来源于stack exchange,提问作者شاه نوаз
相关产品推荐
相关产品推荐

