R语言ggplot2分面图固定X轴时间边界及小时刻度设置方法
问题根源
- 原代码使用
scale_x_continuous()无效,是因为Time列为POSIXct日期时间类型,不是连续数值型变量,必须使用时间类专用刻度函数 - 不同日期的
POSIXct时间戳底层数值相差一整天的秒数,直接设置固定数值范围无法匹配所有日期的8:00-17:00区间 - 原代码
facet_wrap()设置scales = "free_x"会根据单个分面的数据自动调整轴范围,无法强制全局统一
修正代码
library(tidyverse) library(lubridate) graph_POST %>% mutate( day = lubridate::day(Date), # 将带日期的时间戳转为仅保留当日时分秒,对齐不同日期的同一时刻到同一坐标 Time = hms::as_hms(Time) ) %>% pivot_longer(Standing:New_Sitting, names_to = "Posture") %>% ggplot(aes(x = Time, y = value, color = Posture))+ geom_point(size=0.5)+ scale_y_continuous(limits = c(0.5,4.5), expand = expansion(0)) + # 配置统一X轴:8:00-17:00范围,每小时1个刻度 scale_x_time( limits = hms::hms(hours = c(8, 17)), breaks = hms::hms(hours = 8:17), labels = ~format(.x, "%H:%M"), expand = expansion(0) ) + # 固定X轴缩放,所有分面轴范围完全一致 facet_wrap(~day, scales = "fixed") + labs(title = "Posture vs. Time (POST)", x = "Time") + theme( axis.title.y = element_blank(), axis.text.y = element_blank(), panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank() )
关键配置说明
- 若不想使用hms包,可直接用秒数设置时间参数:8点对应
8*3600秒、17点对应17*3600秒,将scale_x_time()替换为如下代码即可,效果完全一致:scale_x_continuous( limits = c(8*3600, 17*3600), breaks = seq(8*3600, 17*3600, 3600), labels = ~format(as.POSIXct(.x, origin = Sys.Date()), "%H:%M"), expand = expansion(0) ) - 若需要调整刻度显示样式,直接修改
labels参数即可,比如要显示为“8点”“9点”格式,可将labels设置为~paste0(lubridate::hour(.x), "点")
内容的提问来源于stack exchange,提问作者Richard Michaud Langis
相关产品推荐
相关产品推荐

