如何将 scale_y_datetime 与 difftime 数据一起使用?
How to use scale_y_datetime with difftime data?
有没有办法在累积持续时间的水平堆叠条形图中使用 scale_y_datetime()
?
我有这样结构的数据:
x1 = as.POSIXct("2020-08-01 12:00")
x2 = as.POSIXct("2020-08-01 16:00")
df = tibble::tibble(
x = seq(dt_start, dt_end, length.out = 10) + rnorm(10, 0, sd = 300),
y = difftime(x, lag(x, 1))
) %>%
filter(!is.na(y)) # First lag(x, 1) is NA.
所以df
是:
# A tibble: 9 x 2
x y
<dttm> <drtn>
1 2020-08-01 11:42:19 31.60503 mins
2 2020-08-01 12:09:29 27.17099 mins
3 2020-08-01 12:50:43 41.23540 mins
4 2020-08-01 13:10:45 20.03007 mins
5 2020-08-01 13:42:00 31.26120 mins
6 2020-08-01 14:24:41 42.67504 mins
7 2020-08-01 14:44:43 20.02577 mins
8 2020-08-01 15:15:10 30.45446 mins
9 2020-08-01 15:40:41 25.51719 mins
我使用水平堆叠的条形图绘制此图:
gg = ggplot(df, aes(x = 1, y = y, fill = as.factor(x))) +
geom_bar(stat = "identity") +
coord_flip()
现在我想在 x-axis 上显示 df$x
中的时间。然而,这失败了:
gg + scale_y_datetime()
有错误
Error: Invalid input: time_trans works with objects of class POSIXct only
可能是因为 df$x
是 difftime
object。我尝试了各种解决方案,但只有一个非常迂回的解决方案有效:
x_pos = seq(min(df$x), max(df$x), length.out = 10)
x_label = format(x_pos, "%H:%M")
gg + scale_y_continuous(breaks = as.numeric(x_pos - min(df$x)) / 60, labels = x_label)
这需要知道您的日期范围的范围(此处为“分钟”--> / 60
),并且您无法很好地四舍五入时间戳。有没有办法使用 scale_y_datetime()
?
我想我没有理解你为什么使用时差的要点..但我没有从你的问题中得到它..
你不能接受这个吗?
library(dplyr)
library(ggplot2)
# reproducible example
x1 <- Sys.time()
x2 <- Sys.time() + 1000
df <- tibble::tibble(x = seq(x1, x2, length.out = 10) + rnorm(10, 0, sd = 300))
df <- df %>% mutate(x1 = lag(x)) %>% filter(!is.na(x1))
# solution ?
ggplot(df) +
geom_rect(aes(xmin = x1, xmax = x, ymin = 0, ymax = 1, fill = factor(x)), show.legend = FALSE)
有没有办法在累积持续时间的水平堆叠条形图中使用 scale_y_datetime()
?
我有这样结构的数据:
x1 = as.POSIXct("2020-08-01 12:00")
x2 = as.POSIXct("2020-08-01 16:00")
df = tibble::tibble(
x = seq(dt_start, dt_end, length.out = 10) + rnorm(10, 0, sd = 300),
y = difftime(x, lag(x, 1))
) %>%
filter(!is.na(y)) # First lag(x, 1) is NA.
所以df
是:
# A tibble: 9 x 2
x y
<dttm> <drtn>
1 2020-08-01 11:42:19 31.60503 mins
2 2020-08-01 12:09:29 27.17099 mins
3 2020-08-01 12:50:43 41.23540 mins
4 2020-08-01 13:10:45 20.03007 mins
5 2020-08-01 13:42:00 31.26120 mins
6 2020-08-01 14:24:41 42.67504 mins
7 2020-08-01 14:44:43 20.02577 mins
8 2020-08-01 15:15:10 30.45446 mins
9 2020-08-01 15:40:41 25.51719 mins
我使用水平堆叠的条形图绘制此图:
gg = ggplot(df, aes(x = 1, y = y, fill = as.factor(x))) +
geom_bar(stat = "identity") +
coord_flip()
现在我想在 x-axis 上显示 df$x
中的时间。然而,这失败了:
gg + scale_y_datetime()
有错误
Error: Invalid input: time_trans works with objects of class POSIXct only
可能是因为 df$x
是 difftime
object。我尝试了各种解决方案,但只有一个非常迂回的解决方案有效:
x_pos = seq(min(df$x), max(df$x), length.out = 10)
x_label = format(x_pos, "%H:%M")
gg + scale_y_continuous(breaks = as.numeric(x_pos - min(df$x)) / 60, labels = x_label)
这需要知道您的日期范围的范围(此处为“分钟”--> / 60
),并且您无法很好地四舍五入时间戳。有没有办法使用 scale_y_datetime()
?
我想我没有理解你为什么使用时差的要点..但我没有从你的问题中得到它..
你不能接受这个吗?
library(dplyr)
library(ggplot2)
# reproducible example
x1 <- Sys.time()
x2 <- Sys.time() + 1000
df <- tibble::tibble(x = seq(x1, x2, length.out = 10) + rnorm(10, 0, sd = 300))
df <- df %>% mutate(x1 = lag(x)) %>% filter(!is.na(x1))
# solution ?
ggplot(df) +
geom_rect(aes(xmin = x1, xmax = x, ymin = 0, ymax = 1, fill = factor(x)), show.legend = FALSE)