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

基于R语言ggplot2绘制分组柱状图:无需转换数据框咨询

嘿,刚好我天天跟ggplot2打交道,完全不用折腾数据转换就能搞定你要的分组柱状图!分两种常见场景给你讲清楚:

不用数据转换绘制分组柱状图的两种场景

场景1:你的数据是长格式(原生支持,最省心)

如果你的数据已经是长格式——也就是有单独的分组列、子类别列和数值列,那直接就能画,完全不需要碰原有数据结构。

举个示例数据的样子:

# 长格式示例数据框
df_long <- data.frame(
  主分组 = c("A组", "A组", "A组", "B组", "B组", "B组", "C组", "C组", "C组"),
  子类别 = rep(c("指标1", "指标2", "指标3"), 3),
  数值 = c(10, 12, 7, 15, 9, 11, 8, 14, 13)
)

直接绘制分组柱状图的代码:

library(ggplot2)

ggplot(df_long, aes(x = 主分组, y = 数值, fill = 子类别)) +
  geom_col(position = position_dodge(width = 0.8)) + # position_dodge实现同组柱子并排
  labs(title = "长格式数据分组柱状图", x = "主分组", y = "数值", fill = "子类别") +
  theme_minimal()

这里fill = 子类别用来区分不同的子分组,position_dodge参数控制同组柱子的间距,全程不用修改你的原始数据框。

场景2:你的数据是宽格式(无需转换直接画)

如果你的数据是宽格式——每个子类别对应单独一列,也不用转成长格式,直接叠加图层就能实现分组效果。

比如你的数据框是这样的:

# 宽格式示例数据框
df_wide <- data.frame(
  主分组 = c("A组", "B组", "C组"),
  指标1 = c(10, 15, 8),
  指标2 = c(12, 9, 14),
  指标3 = c(7, 11, 13)
)

不用转换数据的绘制代码:

library(ggplot2)

ggplot(df_wide) +
  # 逐个添加每个子类别的柱子,设置position_dodge让它们并排
  geom_col(aes(x = 主分组, y = 指标1, fill = "指标1"), position = position_dodge(0.8), width = 0.7) +
  geom_col(aes(x = 主分组, y = 指标2, fill = "指标2"), position = position_dodge(0.8), width = 0.7) +
  geom_col(aes(x = 主分组, y = 指标3, fill = "指标3"), position = position_dodge(0.8), width = 0.7) +
  # 手动设置图例样式
  scale_fill_manual(name = "子类别", values = c("指标1" = "#E69F00", "指标2" = "#56B4E9", "指标3" = "#009E73")) +
  labs(title = "宽格式无转换分组柱状图", x = "主分组", y = "数值") +
  theme_minimal()

这种方法完全保留你的原始数据结构,只是逐个添加子分组的图层。如果子类别很多的话,这种方式会有点繁琐,这时候其实一行tidyr::pivot_longer就能转成长格式,但如果你坚持不碰数据,上面的方法完全可行。

小细节调整

如果觉得柱子间距不合适,可以修改position_dodge里的width参数(比如改成0.9让柱子更紧凑),或者调整geom_col的width参数控制柱子本身的粗细。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:33:34