如何在R语言ggplot2折线图中添加带年份标注的二级x轴
实现方案
- 可行性:完全可以通过
annotate()函数实现需求,全程无需使用xlim参数扩展x轴范围。所有标注的x坐标均落在现有数据集覆盖的日期区间内,不需要额外预留轴外空间。 - 核心实现逻辑:
- 取每个年份组的首个数据点对应的日期作为标注的x坐标,匹配左对齐要求:
- 2018年组:首点为
2018-12-01 - 2019年组:首点为
2019-01-01 - 2020年组:首点为
2020-01-01
- 2018年组:首点为
- 将标注放置在月度x轴刻度的下方区域,设置水平无旋转、左对齐,匹配标注样式要求
- 仅小幅调整y轴下限留出标注空间,完全不改动现有x轴的刻度范围
- 取每个年份组的首个数据点对应的日期作为标注的x坐标,匹配左对齐要求:
可直接运行的修改后代码
#数据生成 Month1 <- c(201812,20191,20192,20193,20194,20195,20196, 20197,20198,20199,201910,201911,201912,20201 ,20202,20203,20204,20205,20206,20207 ,20208,20209,202010,202011) Rate <- c(3.3,3.4,3.1,3.0,3.1,2.9,2.6,2.5,2.3,2.1,1.6,1.7,1.5,1.7,1.1,-0.4, -19.5,-17.6,-10.5,-9.6,-9.1,-8.6,-8.0,-7.7) cesyoy <- data.frame(Month1,Rate) #加载依赖包 library(ggplot2) library(dplyr) library(lubridate) library(scales) library(odbc) ## 绘制折线图 linechart <- cesyoy %>% mutate(year = substr(as.character(Month1),1,4), month = substr(as.character(Month1),5,7), date = as.Date(paste(year,month,"1",sep ="-"))) %>% ggplot()+ geom_line(aes(x=date,y=Rate),color="red")+ # 调整y轴范围,仅为下方年份标注留出空间,不改动x轴范围 scale_y_continuous(labels = scales::percent, limits = c(-25, 4))+ scale_x_date(date_breaks="1 month", date_labels="%b\n")+ # 添加二级年份x轴标注 annotate( geom = "text", x = c(ymd("2018-12-01"), ymd("2019-01-01"), ymd("2020-01-01")), y = -23, label = c("2018", "2019", "2020"), hjust = 0, # 左对齐 angle = 0, # 水平显示 size = 3 )+ theme( panel.grid.major = element_blank(), axis.text.x = element_text(angle = 90, size=rel(0.6)), plot.margin = margin(t = 20, r = 10, b = 40, l = 10) # 给底部标注留出边距,防止截断 )+ ggtitle("Employment Growth (%)") print(linechart)
注意:这里设置的
ylim仅用于给下方的年份标注预留垂直空间,全程没有修改x轴的显示范围,完全符合你不需要扩展x轴的要求。
内容的提问来源于stack exchange,提问作者Tim Wilcox
相关产品推荐
相关产品推荐

