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

如何在双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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:48:13