如何调整R绘图中小时:分钟类型Y轴的刻度顺序与显示
调整就寝时间Y轴刻度(从12:00到次日11:59)
这个需求的核心是把常规的00:00-24:00时间轴,调整为以12:00为起点、00:00在中间、11:59在顶部的顺序。由于时间类型变量本质是数值(从某个原点开始的秒数),我们可以通过数值偏移+自定义刻度标签来实现这个效果,具体步骤如下:
步骤1:转换时间为可操作的数值
首先把就寝时间转换成一天中的秒数,这样我们能对时间进行数学偏移:
# 创建原始数据 data <- data.frame(dates = as.POSIXct(c( "2019-07-21 01:00:00","2019-07-22 00:45:00","2019-07-23 02:30:00", "2019-07-24 23:30:00","2019-07-25 22:45:00","2019-07-26 21:45:00", "2019-07-27 23:45:00","2019-07-28 00:45:00","2019-07-29 01:30:00", "2019-07-30 02:45:00","2019-07-31 02:35:00","2019-08-01 00:20:00", "2019-08-02 23:55:00","2019-08-03 23:15:00","2019-08-04 01:15:00" ))) # 将就寝时间转为一天中的秒数(从00:00开始计算) data$bedtime_secs <- as.numeric(difftime(data$dates, trunc(data$dates, "day"), units = "secs")) # 偏移处理:把12:00之前的时间(00:00-11:59)加上一天的秒数(86400) # 这样12:00的秒数(43200)成为最小值,00:00(0秒+86400)成为中间值,11:59成为最大值 data$bedtime_shifted <- ifelse(data$bedtime_secs < 43200, data$bedtime_secs + 86400, data$bedtime_secs)
步骤2:绘制自定义轴的图表
接下来我们先绘制空白图,再手动添加数据点和自定义Y轴:
# 绘制空白画布,关闭默认Y轴 plot(data$dates, data$bedtime_shifted, type = "n", # 先不绘制数据点 xlab = "Date (Month-Day)", ylab = "Bedtime (Hours:Minutes)", ylim = c(43200, 43200 + 86400), # Y轴范围:12:00到次日11:59 yaxt = "n" # 禁用默认Y轴刻度 ) # 添加数据点(可以自定义样式) points(data$dates, data$bedtime_shifted, pch = 16, col = "#2196F3") # 定义想要显示的Y轴刻度位置(秒数) tick_positions <- c( 43200, # 12:00 43200 + 18000, # 17:00(12点+5小时) 86400, # 00:00 86400 + 18000, # 05:00 86400 + 43140 # 11:59 ) # 将刻度位置转换为小时:分钟格式的标签 tick_labels <- format(as.POSIXct(tick_positions %% 86400, origin = "1970-01-01"), "%H:%M") # 添加自定义Y轴 axis(side = 2, at = tick_positions, labels = tick_labels) # 可选:添加网格线让图表更易读 grid(nx = NA, ny = length(tick_positions)-1)
原理说明
- 时间类型(POSIXct)本质是从1970-01-01开始的秒数,我们提取一天内的秒数后,就能用数值逻辑调整顺序。
- 偏移操作把00:00-11:59的时间“移到”12:00之后,让Y轴呈现你想要的循环顺序。
- 自定义刻度时,通过对86400取余,把偏移后的数值转换回正常的时间格式,保证标签显示正确。
内容的提问来源于stack exchange,提问作者RobZ
相关产品推荐
相关产品推荐

