如何在双geom_col的ggplot柱状图中按fill变量分组排列
实现同一特征下y1/y2柱形相邻的柱状图
当然可以实现你想要的效果!直接混合两个geom_col元素不是最简洁的方案,我们可以通过整理数据格式配合ggplot的分组功能,轻松让同一AB特征对应的y1和y2柱形相邻,同时兼顾不同特征和y变量的对比。
步骤1:将宽格式数据转换为长格式
你的原始数据是宽格式(y1、y2作为单独列),ggplot更适合处理长格式数据。我们可以用tidyr::pivot_longer把y1和y2合并成一个分类变量,方便后续分组:
library(ggplot2) library(tidyr) # 转换数据格式 test_long <- test %>% pivot_longer( cols = c(y1, y2), # 要合并的列 names_to = "y_variable", # 新的分类变量名(标记y1/y2) values_to = "percentage" # 存储百分比值的列 )
转换后的长格式数据每一行对应一个x值、AB特征、y变量类型和百分比,更符合ggplot的绘图逻辑。
步骤2:绘制分组并排柱状图
接下来我们用position_dodge()实现同一AB特征下y1和y2的柱形相邻:
p <- ggplot(test_long, aes(x = factor(x), y = percentage, fill = AB)) + # 按y_variable分组,让同一AB的y1/y2并排 geom_col(aes(group = y_variable), position = position_dodge(width = 0.8)) + # 保留你原来的透明填充色设置 scale_fill_manual(values = alpha(c("darkred","darkgreen","blue"), 0.6)) + # 添加坐标轴标签,提升可读性 labs(x = "x Value", y = "Percentage", fill = "Feature") + coord_flip() p
可选优化:增强y1/y2的区分度
如果想让同一AB下的y1和y2更易区分,可以给柱形添加边框颜色映射到y变量类型:
p <- ggplot(test_long, aes(x = factor(x), y = percentage, fill = AB)) + geom_col( aes(group = y_variable, color = y_variable), position = position_dodge(width = 0.8), size = 0.5 # 调整边框粗细 ) + scale_fill_manual(values = alpha(c("darkred","darkgreen","blue"), 0.6)) + scale_color_manual(values = c("black", "darkgray"), labels = c("y1", "y2")) + labs(x = "x Value", y = "Percentage", fill = "Feature", color = "Y Variable") + coord_flip() p
关于直接混合两个geom_col的说明
如果一定要用两个geom_col来实现,理论上可以通过position_nudge()手动调整柱子位置,但这种方法需要计算偏移量,不仅繁琐,而且后续修改数据或参数时需要重新调整,远不如转长格式的方案灵活易维护,所以更推荐上面的长格式分组方法。
内容的提问来源于stack exchange,提问作者Franziska
相关产品推荐
相关产品推荐

