如何在ggplot2中将difftime格式化为hh:mm?

时间:2018-12-16 17:15:52

标签: r ggplot2 difftime

我想使用ggplot2显示difftime数据,并且希望刻度格式为hh:mm

library(ggplot2)  

a= as.difftime(c("0:01", "4:00"), "%H:%M", unit="mins")
b= as.difftime(c('0:01', "2:47"), "%H:%M", unit="mins")

ggplot(data=NULL, aes(x=b, y=a)) + geom_point(shape=1) +    
                  scale_x_time(labels = date_format("%H:%M"), 
                               breaks = "1 hour")

但是我收到以下警告:

Don't know how to automatically pick scale for object of type difftime. Defaulting to continuous.
Warning message:
In structure(as.numeric(x), names = names(x)) : NAs introduced by coercion

,以图形形式显示: enter image description here

更新: 我的示例太少了,我还需要能够显示负差异,所以这将是更好的数据:

a= as.difftime(c(-60, -4*60),  unit="mins")
b= as.difftime(c(-60, 2*60+47), unit="mins")
ggplot(data=NULL, aes(x=b, y=a)) + geom_point(shape=1)

3 个答案:

答案 0 :(得分:1)

根据您的约束,您可以考虑将difftimes转换为不同的日期时间,ggplot可以很好地处理该日期时间:

library(lubridate)
a_date_times <- floor_date(Sys.time(), "1 day") + a
b_date_times <- floor_date(Sys.time(), "1 day") + b
ggplot(data=NULL, aes(x=a_date_times, y=b_date_times)) + 
  geom_point(shape=1)

enter image description here

答案 1 :(得分:1)

到目前为止,我最好的方法是:

library(ggplot2)  
library(lubridate)

a= as.difftime(c(-60, -4*60),  unit="mins")
b= as.difftime(c(-60, 2*60+47), unit="mins")

xbreaks = seq(ceiling(min(b)/60), floor(max(b)/60)) * 60
ybreaks = seq(ceiling(min(a)/60), floor(max(a)/60)) * 60


ggplot(data=NULL, aes(x=b, y=a)) + geom_point(shape=1) + 
                  scale_x_continuous(labels = f, breaks = xbreaks) +
                  scale_y_continuous(labels = f, breaks = ybreaks)



f <- function(x){
  t = seconds_to_period(abs(x)*60)
  r = sprintf("% 2i:%02i", sign(x)*hour(t), minute(t))
  return(r)
}

答案 2 :(得分:1)

答案分为两个部分。

绘制difftime对象

根据help("scale_x_time")ggplot2支持三种日期/时间类别:scale_*_date用于日期(类别Date),scale_*_datetime用于日期时间({{1 }})和class POSIXct时间(类scale_*_time)。最后一个是我们在这里需要的。

hmshms向量的自定义类。 difftime具有用于as.hms()的方法。所以。通过强制类difftime,可以用difftime绘制ggplot2对象:

hms

enter image description here

请注意,还会显示负时差。

格式化刻度标签

OP要求刻度线应标记为a <- as.difftime(c(-60, -4 * 60), unit = "mins") b <- as.difftime(c(-60, 2 * 60 + 47), unit = "mins") library(ggplot2) ggplot(data = NULL, aes(x = hms::as.hms(b), y = hms::as.hms(a))) + geom_point(shape = 1) 格式。显然,默认格式为hh:mm。可以通过指定以下函数进行修改:将中断作为输入,并将标签作为输出返回到hh:mm:sslabels函数的scale_x_time()参数:

scale_y_time()

enter image description here

format_hm <- function(sec) stringr::str_sub(format(sec), end = -4L) ggplot(data = NULL, aes(x = hms::as.hms(b), y = hms::as.hms(a))) + geom_point(shape = 1) + scale_x_time(name = "b", labels = format_hm) + scale_y_time(name = "a", labels = format_hm) 函数将默认格式的format_hm()部分截断。此外,该轴的标签也很好。