R语言ggplot堆叠柱状图与折线图组合:X轴月份标签异常问题
解决ggplot2组合图X轴日期显示异常的问题
你遇到的X轴显示2017年9月且缺失2017年12月标签的问题,主要是因为scale_x_yearmon()的刻度生成逻辑导致的——默认情况下它会自动调整刻度的数量和位置,不会严格匹配你数据里的所有月份,而且可能会轻微扩展时间范围来让刻度对齐更“美观”。
具体原因拆解
- 你用了
scale_x_yearmon(format = "%Y-%b", n = 6),这里的n参数只是建议ggplot生成约6个刻度,不是强制生成6个完全匹配你数据的刻度,所以ggplot会自动计算间隔,导致出现了不在你数据里的2017年9月,同时漏掉了2017年12月。 yearmon类型的日期在计算刻度时,会基于时间间隔自动扩展范围,这也是出现额外月份的原因之一。
修正方案
我们可以通过强制指定X轴的刻度范围和具体刻度点来解决这个问题,直接让X轴只显示你数据里存在的6个月份:
第一步:确保数据准备代码完整(加载必要依赖包)
首先别忘了加载代码用到的依赖包:
library(ggplot2) library(zoo) library(dplyr) library(scales) # 生成df1 df1 <- data.frame( month = rep(c("Okt 2017", "Nov 2017", "Dez 2017", "Jan 2018", "Feb 2018", "Mrz 2018"), each=3), source = rep(c("a", "b", "c"), 6), value1 = sample(1000L:4000L, 18, replace=FALSE) ) df1$month <- as.yearmon(df1$month) df1 <- arrange(df1, month) # 生成df2 df2 <- data.frame( month = c("Okt 2017", "Nov 2017", "Dez 2017", "Jan 2018", "Feb 2018", "Mrz 2018"), value2 = sample(5000000L:6000000L, 6, replace=FALSE) ) df2$month <- as.yearmon(df2$month) df2 <- arrange(df2, month)
第二步:修改绘图代码的X轴刻度设置
把scale_x_yearmon()的参数改成指定limits和breaks,强制使用你数据里的所有月份:
ggplot() + geom_bar(data = df1, aes(month, value1*5000000/5000, fill = source), stat="identity", position = "stack") + geom_point(data = df2, aes(month, value2), color = "blue")+ geom_line(data = df2, aes(month, value2), group = 1, color = "blue") + labs(x = "month", y="value2 (line)") + scale_y_continuous( sec.axis = sec_axis(~.*5000/5000000, name = "value1 (bars)"), labels= format_format(big.mark = ".", decimal.mark = ",", scientific = FALSE) ) + # 关键修改:指定limits锁定时间范围,用breaks强制显示所有数据中的月份 scale_x_yearmon( format = "%Y-%b", limits = range(df1$month), # 锁定在数据的最小和最大月份之间 breaks = unique(df1$month) # 强制显示数据里的所有月份作为刻度 ) + scale_fill_manual(values= c("darkseagreen4","darkseagreen", "darkseagreen3")) + theme_light()
修改说明
limits = range(df1$month):把X轴的时间范围严格限制在你数据的起始(2017-10)和结束(2018-03)月份,避免ggplot自动扩展范围出现2017-09。breaks = unique(df1$month):直接用数据里所有唯一的月份作为刻度点,这样就能确保2017年12月的标签不会丢失,同时显示的所有刻度都是你需要的月份。
这样修改后,X轴就会精准显示2017年10月到2018年3月的所有6个月份,不会出现多余或缺失的情况啦~
内容的提问来源于stack exchange,提问作者nississippi
相关产品推荐
相关产品推荐

