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

设置position=dodge后ggplot2柱状图仍堆叠的问题求助

问题原因

你调用了两次geom_bar(),每个图层的position="dodge"仅对当前图层内的元素生效,两个图层之间不会互相避让,所以柱状图依然堆叠。ggplot2的position="dodge"是针对同一图层内的分组变量生效的,而非跨图层。

解决方案:整理数据为长格式

将宽格式数据转换为长格式(tidy data),用单个geom_bar()实现并排效果:

library(ggplot2)
library(tidyr)

# 原始数据
df <- data.frame(
  category = c("A", "B", "C"),
  value1 = c(10, 15, 5),
  value2 = c(8, 12, 3)
)

# 转换为长格式并处理value2的负数值
df_long <- df %>%
  pivot_longer(
    cols = starts_with("value"),
    names_to = "group",
    values_to = "value"
  ) %>%
  mutate(
    value = ifelse(group == "value2", -value, value),
    group = factor(group, labels = c("Value 1", "Value 2"))
  )

# 绘制并排柱状图
ggplot(df_long, aes(x = category, y = value, fill = group)) +
  geom_bar(stat = "identity", position = "dodge") +
  ylab("Value") +
  labs(fill = "Legend")
补充说明
  • 转长格式后,group变量作为分组依据,fill映射到该变量,此时position="dodge"会自动让同一x轴分类下的不同分组柱状图并排显示。
  • 若未安装tidyr包,可先运行install.packages("tidyr")安装。也可以用reshape2::melt()实现数据格式转换,逻辑完全一致。

内容的提问来源于stack exchange,提问作者Maranda Hua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:35:05