基于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
相关产品推荐
相关产品推荐

