如何在 ggplot2 中将 difftime 格式化为 hh:mm?
How to format difftime as hh:mm in ggplot2?
我想用 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
这是一张图表:
更新:
我的示例太小了,我还需要能够显示负差异,所以这会是更好的数据:
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)
根据您的限制,您可以考虑将差异时间转换为不同的日期时间,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)
到目前为止我最好的方法是:
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)
}
答案分为两部分。
正在绘制 difftime
个对象
根据 help("scale_x_time")
,ggplot2
支持三个 date/time classes:scale_*_date
for dates (class Date
),日期时间为 scale_*_datetime
(class POSIXct
),时间为 scale_*_time
(class hms
)。最后一个是我们这里需要的。
Class hms
是 difftime
向量的自定义 class。 as.hms()
有 difftime
的方法。所以。 difftime
对象可以通过强制 class hms
:
用 ggplot2
绘制
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)
请注意,也会显示负时差。
格式化刻度标签
OP 要求刻度线应以 hh:mm
格式标记。显然,默认格式是 hh:mm:ss
。这可以通过指定一个函数来修改,该函数将中断作为输入,并将 returns 标签作为输出到 scale_x_time()
和 scale_y_time()
函数的 labels
参数:
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()
函数从默认格式中截断 :ss
部分。此外,轴标记得很好。
我想用 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
这是一张图表:
更新: 我的示例太小了,我还需要能够显示负差异,所以这会是更好的数据:
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)
根据您的限制,您可以考虑将差异时间转换为不同的日期时间,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)
到目前为止我最好的方法是:
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)
}
答案分为两部分。
正在绘制 difftime
个对象
根据 help("scale_x_time")
,ggplot2
支持三个 date/time classes:scale_*_date
for dates (class Date
),日期时间为 scale_*_datetime
(class POSIXct
),时间为 scale_*_time
(class hms
)。最后一个是我们这里需要的。
Class hms
是 difftime
向量的自定义 class。 as.hms()
有 difftime
的方法。所以。 difftime
对象可以通过强制 class hms
:
ggplot2
绘制
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)
请注意,也会显示负时差。
格式化刻度标签
OP 要求刻度线应以 hh:mm
格式标记。显然,默认格式是 hh:mm:ss
。这可以通过指定一个函数来修改,该函数将中断作为输入,并将 returns 标签作为输出到 scale_x_time()
和 scale_y_time()
函数的 labels
参数:
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()
函数从默认格式中截断 :ss
部分。此外,轴标记得很好。