R语言ggplot2绘制并列柱状图问题求助
解决ggplot2柱状图柱子重叠、实现并列显示的问题
你的问题核心是数据格式不符合ggplot2的要求,以及重复调用geom_col导致无法正确触发分组并列。ggplot2基于「整洁数据」设计,要求每个变量单独成列、每个观测单独成行,而你的数据是宽格式(两组百分比各占一列),需要先转换为长格式,再绘图就能解决重叠问题。
步骤1:转换数据格式
使用tidyr::pivot_longer将宽格式数据转为长格式,把两组百分比合并为一个数值列,同时新增一列标记分组:
library(ggplot2) library(tidyr) # 用于数据转换 # 示例数据(读取本地文件时,确保read.csv2的分隔符匹配你的csv,或改用read.csv) data <- structure(list(COG_category = c("NC", "S", "T", "Y"), involved_percent = c(22.01, 17.25, 14.96, 8.8), BO4_percent = c(20.47, 18.95, 7.83, 7.17)), class = "data.frame", row.names = c(NA, -4L)) # 转长格式 data_long <- pivot_longer(data, cols = c(involved_percent, BO4_percent), # 指定要合并的百分比列 names_to = "group", # 分组列的名称 values_to = "percent") # 数值列的名称
转换后的数据结构(整洁格式):
# A tibble: 8 × 3 COG_category group percent <chr> <chr> <dbl> 1 NC involved_percent 22.0 2 NC BO4_percent 20.5 3 S involved_percent 17.2 4 S BO4_percent 19.0 5 T involved_percent 15.0 6 T BO4_percent 7.83 7 Y involved_percent 8.8 8 Y BO4_percent 7.17
步骤2:绘制并列柱状图
用转换后的长格式数据绘图,仅需一次geom_col,通过fill = group指定分组,配合position = position_dodge()实现柱子并列:
ggplot(data_long, aes(x = COG_category, y = percent, fill = group)) + geom_col(width = 0.7, position = position_dodge(width = 0.8)) + # 调整width控制柱子宽度和间距 scale_fill_manual(name = "Group", values = c("involved_percent" = "blue", "BO4_percent" = "red")) + # 修正原代码的名称笔误 xlab("COG Category") + ylab("Percentage") + ggtitle("COG Category Percentage Comparison") + theme(legend.position = "bottom") # 修正原代码的标点错误(去掉空格)
关键修正点说明
- 数据格式转换:宽格式转长格式是核心,让ggplot能识别同一COG类别下的两个分组数据,从而自动触发并列逻辑。
- 单一geom_col调用:避免重复调用
geom_col,否则ggplot会将两组柱子视为独立图层,无法触发分组dodge。 - 参数错误修正:原代码中
scale_fill_manual里的Candidate_percent是笔误,应对应involved_percent;theme中的legend. position多了空格,会导致参数无效。
内容的提问来源于stack exchange,提问作者se-tima
相关产品推荐
相关产品推荐

