如何用ggplot将chron包的时间以hh:mm格式绘图?
解决ggplot中chron时间轴显示为日分数的问题
首先得明确:chron包的times类型本质是一天的分数值(0代表00:00:00,1代表24:00:00),所以ggplot会把它当成连续数值处理,导致X轴显示0-1。下面给你两种实用的解决办法:
方法1:自定义连续轴的刻度与标签
不需要转换数据类型,直接在ggplot里用scale_x_continuous手动设置刻度和对应的时间格式标签:
library(ggplot2) library(chron) # 在你的原始绘图代码基础上修改 ggplot(x, aes(x = Time, y = Sum_C.Total)) + geom_point() + scale_x_continuous( # 设置刻度:每1小时一个刻度(1/24是一天的1小时占比) breaks = seq(0, 1, by = 1/24), # 把日分数转成hh:mm格式的标签 labels = function(x) times(x) %>% format("%H:%M") ) + labs(x = "时间")
如果需要更细的刻度(比如每15分钟),把by改成1/(24*4)即可;想要显示秒数的话,把标签格式换成"%H:%M:%S"就行。
方法2:将chron时间转换为ggplot可识别的时间类型
把chron的times转成hms包的时间对象,或者POSIXct类型,这样ggplot会自动识别为时间轴,不用手动设置刻度:
用hms包转换
library(ggplot2) library(chron) library(hms) # 将chron times转成hms对象 x$time_hms <- as.hms(x$Time) # 直接绘图,ggplot会自动处理时间刻度 ggplot(x, aes(x = time_hms, y = Sum_C.Total)) + geom_point() + labs(x = "时间")
用POSIXct转换
library(ggplot2) library(chron) # 转成POSIXct(需要指定一个日期原点,这里选一个不影响的固定日期即可) x$time_posix <- as.POSIXct(x$Time, origin = "2020-01-01") # 绘图并设置时间显示格式 ggplot(x, aes(x = time_posix, y = Sum_C.Total)) + geom_point() + scale_x_datetime(labels = scales::date_format("%H:%M:%S")) + labs(x = "时间")
为什么你之前的方案没生效?
你提到的"%02d:00"格式不适用,是因为那个方案是针对“小时数”数值的格式化,而chron的时间是日分数,不是直接的小时数。比如1小时对应的日分数是1/24≈0.0417,直接用%d格式化会得到0,所以才会出问题。上面的两种方法都避开了这个问题,直接基于chron的时间转换逻辑来处理。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

