ggplot2中POSIXct时间轴仅显示当日时间及刻度限制问题
ggplot2 时间轴显示与刻度范围设置解决方案
问题1:无需转换hms类型,仅显示POSIXct数据的当日时间
直接使用scale_y_datetime()并自定义刻度标签格式,只保留时间部分即可实现和hms类型一致的显示效果,无需转换数据类型:
plot3 <- ggplot(test) + geom_point(aes(x = x, y = dates)) + scale_y_datetime(labels = function(x) format(x, "%H:%M:%S"))
无论原始数据中的日期是什么,Y轴只会显示时:分:秒格式的当日时间,和plot2的显示效果一致。如果需要更简洁的格式(比如只显示时:分),可以把format参数改成"%H:%M"。
问题2:设置scale_*_time/scale_y_datetime的小时范围限制
limits参数需要传入时间类型的对象,不能直接用数字。针对当日8点到22点的需求,有两种可行方式:
方式1:使用scale_y_time()配合hms对象
如果用scale_y_time(),直接用hms::hms()创建对应时间作为limits:
plot4 <- ggplot(test) + geom_point(aes(x = x, y = hms_dates)) + scale_y_time(limits = hms::hms(hours = c(8, 22)))
方式2:使用scale_y_datetime()配合POSIXct对象
如果用原始的POSIXct类型数据,需要创建包含日期的POSIXct对象作为limits(随便选一天的8点和22点即可,因为我们只关心时间部分):
plot5 <- ggplot(test) + geom_point(aes(x = x, y = dates)) + scale_y_datetime( labels = function(x) format(x, "%H:%M:%S"), limits = ymd_hms(c("2022-01-01 08:00:00", "2022-01-01 22:00:00")) )
这样Y轴就会被限制在8点到22点之间,超出范围的点会被隐藏(比如示例中6点的点会被截掉)。
完整演示代码
library(tidyverse) library(lubridate) library(hms) library(patchwork) test <- tibble( dates = c(ymd_hms("2022-01-01 6:00:00"), ymd_hms("2023-01-01 19:00:00")), x = c(1, 2), hms_dates = as_hms(dates) ) # 问题1解决方案 plot3 <- ggplot(test) + geom_point(aes(x = x, y = dates)) + scale_y_datetime(labels = function(x) format(x, "%H:%M:%S")) # 问题2方式1:scale_y_time设置limits plot4 <- ggplot(test) + geom_point(aes(x = x, y = hms_dates)) + scale_y_time(limits = hms::hms(hours = c(8, 22))) # 问题2方式2:scale_y_datetime设置limits plot5 <- ggplot(test) + geom_point(aes(x = x, y = dates)) + scale_y_datetime( labels = function(x) format(x, "%H:%M:%S"), limits = ymd_hms(c("2022-01-01 08:00:00", "2022-01-01 22:00:00")) ) # 组合展示 plot2 + plot3 + plot4 + plot5 + plot_layout(ncol = 2)
内容的提问来源于stack exchange,提问作者evidently
相关产品推荐
相关产品推荐

