操作POSIX以在ggplot轴中使用的最智能方法是什么?
我正在尝试创建一个函数,用于绘制多个图形(每天一个),跨越几周,使用POSIX时间作为x轴。
为此,我在日期创建了一个额外的整数列 DF$Day
,我输入了该函数。然后,我使用那天创建一个子集,我使用ggplot2绘制。我想到了如何使用scale_x_datetime
格式化POSIX x轴。基本上,我有它显示时间和&仅分钟,省略日期。
以下是我的问题:如何在一天中的几小时内为每张图设置限制?
下面是一些工作,可重现的代码,以获得一个想法。它创造了第一天,显示它3秒钟&创造第二天的收益。但是,每天的限制是根据time
变量的范围选择的。例如,如何全天制作范围(0h - 24h)?
DF <- data.frame(matrix(ncol = 0, nrow = 4))
DF$time <- as.POSIXct(c("2010-01-01 02:01:00", "2010-01-01 18:10:00", "2010-01-02 04:20:00", "2010-01-02 13:30:00"))
DF$observation <- c(1,2,1,2)
DF$Day <- c(1,1,2,2)
for (Individual_Day in 1:2) {
Day_subset <- DF[DF$Day == as.integer(Individual_Day),]
print(ggplot( data=Day_subset, aes_string( x="time", y="observation") ) + geom_point() +
scale_x_datetime( breaks=("2 hour"), minor_breaks=("1 hour"), labels=date_format("%H:%M")))
Sys.sleep(3) }
答案 0 :(得分:3)
嗯,这是一种方式。
# ...
for (Individual_Day in 1:2) {
Day_subset <- DF[DF$Day == as.integer(Individual_Day),]
lower <- with(Day_subset,as.POSIXct(strftime(min(time),"%Y-%m-%d")))
upper <- with(Day_subset,as.POSIXct(strftime(as.Date(max(time))+1,"%Y-%m-%d"))-1)
limits = c(lower,upper)
print(ggplot( data=Day_subset, aes( x=time, y=observation) ) +
geom_point() +
scale_x_datetime( breaks=("2 hour"),
minor_breaks=("1 hour"),
labels=date_format("%H:%M"),
limits=limits)
)
}
lower
的计算花费子集中的最小时间并将其强制转换为仅包含日期部分的字符(例如,去除时间部分)。转换回POSIXct会产生当天的开始。
upper
的计算稍微复杂一些。您必须将最大时间转换为日期值并添加1(例如,1天),然后转换为字符(剥离时间部分),转换回POSIXct,并减去1(例如,1秒)。这在结束日23:59生成。
为这么小的事情做了大量的工作。我希望其他人发布一个更简单的方法来做到这一点......