如何用ggplot2调整时间序列X轴,聚焦7-12月数据?
解决ggplot时间序列仅展示7-12月的问题
核心思路
先筛选出7-12月的数据,再调整x轴的显示范围与刻度,确保只展示目标月份区间。
步骤1:数据预处理(筛选目标月份)
首先确保Date列是标准日期格式,提取年、月、日信息后,筛选出月份≥7的记录,再生成统一年份的datetime列(用于对齐不同年份的同月同日)。
步骤2:调整x轴显示
通过scale_x_datetime设置x轴的范围、刻度与标签,或者用coord_cartesian仅放大目标区域(不删除数据)。
修改后的完整代码
library(tidyverse) library(lubridate) cbPalette <- c("#000000", "#ff9208", "#2adfff", "#00d202", "#ffec16", "#f40300", "#384aff", "#8f0066") p <- df %>% # 转换Date为日期格式,提取年、月、日 mutate(Date = ymd(Date), year = year(Date), month = month(Date), day = day(Date)) %>% # 筛选7-12月的数据 filter(month >= 7) %>% # 生成统一2017年的datetime,用于对齐不同年份的日期 mutate(datetime = make_datetime(2017, month, day)) %>% ggplot() + geom_line(aes(x = datetime, y = values, color = factor(year)), lwd = 1) + # 设置x轴刻度为7-12月,标签为月份缩写 scale_x_datetime(breaks = make_datetime(2017, 7:12), labels = month.abb[7:12], # 限制x轴范围为7月1日至12月31日 limits = c(make_datetime(2017, 7, 1), make_datetime(2017, 12, 31))) + scale_colour_manual(values = cbPalette) + labs(colour = "Year", x = "Date", y = "Number of water pixels") + theme_bw() + theme(axis.text = element_text(size = 12), axis.title = element_text(size = 15)) + theme(axis.title.x = element_text(vjust = -0.8), axis.title.y = element_text(vjust = 3), axis.text.y = element_text(angle = 90, vjust = 1.5, hjust = 0.5)) + theme(legend.title = element_text(size = 15), legend.text = element_text(size = 12)) p
备选方案(仅放大区域,保留全部数据)
如果需要保留1-6月的数据但只展示7-12月的视图,可替换scale_x_datetime的limits参数为coord_cartesian:
ggplot() + geom_line(aes(x = datetime, y = values, color = factor(year)), lwd = 1) + scale_x_datetime(breaks = make_datetime(2017, 7:12), labels = month.abb[7:12]) + # 仅放大7-12月区域,不删除数据 coord_cartesian(xlim = c(make_datetime(2017, 7, 1), make_datetime(2017, 12, 31))) + scale_colour_manual(values = cbPalette) + # 其他主题与标签设置不变 labs(colour = "Year", x = "Date", y = "Number of water pixels") + theme_bw() + theme(axis.text = element_text(size = 12), axis.title = element_text(size = 15)) + theme(axis.title.x = element_text(vjust = -0.8), axis.title.y = element_text(vjust = 3), axis.text.y = element_text(angle = 90, vjust = 1.5, hjust = 0.5)) + theme(legend.title = element_text(size = 15), legend.text = element_text(size = 12))
报错原因说明
之前使用scale_x_datetime或scale_x_continuous报错,大概率是因为:
- 未先筛选数据,导致
datetime包含1-6月的记录,x轴范围设置与数据不匹配; scale_x_continuous不适合日期类型的x轴,必须用scale_x_datetime配合日期格式的limits参数。
内容的提问来源于stack exchange,提问作者lena
相关产品推荐
相关产品推荐

