ggplot2分组柱状图fill分组柱子合并问题及解决方法问询
问题描述
需要用ggplot2绘制分组柱状图,展示两个参考期(refp1、refp2)各30个年份(Jahr)的春季(Fruehling)降水量,预期效果:
- refp1组的30个年份柱子紧密相邻排列
- refp1组与refp2组的柱子之间留有明显间隔
尝试了三段代码,都没达到预期:
- 代码1:
ggplot(refps, aes(fill=Jahr, y=Fruehling, x=refp))+geom_bar(position='dodge',stat='identity')
问题:同一个refp下的所有年份柱子被合并成一个,没有按年份拆分。
- 代码2:
ggplot(refps, aes(Jahr,Fruehling,facet_wrap(~refp)))+geom_col()
问题:两个参考期的图表是分面展示的,没有在同一画布上形成带间隔的分组。
- 代码3:
ggplot(data=refps, aes(factor(refp), y=Fruehling, fill=as.factor(Jahr))) + geom_bar(stat="identity", position = "dodge")
问题:效果接近,但年份只显示在图例里,不在柱子下方;而且每个年份都有不同颜色,希望每个refp组用单一颜色。
数据集示例
Jahr <- c(1988,1989,1990,1991,1992) Fruehling <- c(100,75,110,100,150) refp <- c("refp1","refp1","refp1","refp2","refp2") refps <- data.frame(Jahr,Fruehling,refp)
解答
代码1为什么会合并柱子?
这段代码里x=refp把x轴的每个位置对应一个参考期,fill=Jahr只是给柱子上色,但ggplot默认会把同一x轴位置(同一refp)下的所有数据行合并——因为你没有告诉它要按年份拆分x轴位置。position='dodge'的作用是让同一x位置下的不同fill分组错开,但这里同一refp下的多个年份属于同一个x位置,所以它们会叠加成一个柱子,而不是分开排列。
实现预期效果的方案
要实现“同refp内年份紧连、不同refp间有间隔”的效果,核心是让x轴对应年份,同时用refp来控制分组的间隔。下面两种方法都能实现需求:
方法1:用交互变量组合refp和Jahr,手动控制间隔
library(ggplot2) ggplot(refps, aes(x = interaction(refp, Jahr), y = Fruehling)) + geom_col(aes(fill = refp), width = 0.8) + # 每个参考期用单一颜色 scale_x_discrete( breaks = interaction(refps$refp, refps$Jahr), labels = refps$Jahr, # x轴显示年份 expand = expansion(add = c(0.5, 0.5)) # 给两端留空白 ) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # 年份标签旋转避免重叠 labs(x = "年份", y = "春季降水量", fill = "参考期")
方法2:给不同refp的年份添加偏移量,强制分隔
如果需要更明显的组间间隔,可以在数据里给refp2的年份x轴位置加一个偏移(比如30,对应你的30个年份),这样两组年份在x轴上就会被空白隔开:
# 预处理数据:给refp2的年份加偏移 refps$x_pos <- ifelse(refps$refp == "refp1", refps$Jahr, refps$Jahr + 30) ggplot(refps, aes(x = x_pos, y = Fruehling)) + geom_col(aes(fill = refp), width = 0.8) + scale_x_continuous( breaks = refps$x_pos, labels = refps$Jahr, # 依然显示原始年份 expand = expansion(add = c(1, 1)) ) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(x = "年份", y = "春季降水量", fill = "参考期")
这两种方法都能满足你的需求:年份显示在x轴下方,每个refp组用单一颜色,同组年份紧密相邻,不同组之间有明显间隔。
内容的提问来源于stack exchange,提问作者Amoebe
相关产品推荐
相关产品推荐

