如何使用ggplot在R中绘制时间间隔数据?

How to plot time interval data in R using ggplot?

我有一个类似于以下的数据框:

> library(lubridate)
> df <- data.frame(name = c("george", "sara", "sam", "bill"),
                   start_date = mdy(c("January 1, 2022", "January 2, 2022", "January 5, 2022", "January 6, 2022")),
                   end_date = mdy(c("January 3, 2022", "January 4, 2022", "January 6, 2022", "January 8, 2022")),
                  group = c(1,1,2,2))

> df <- df %>% 
   mutate(date_range = interval(start_date,
                          end_date))
> df
    name start_date   end_date group                     date_range
1 george 2022-01-01 2022-01-03     1 2022-01-01 UTC--2022-01-03 UTC
2   sara 2022-01-02 2022-01-04     1 2022-01-02 UTC--2022-01-04 UTC
3    sam 2022-01-05 2022-01-06     2 2022-01-05 UTC--2022-01-06 UTC
4   bill 2022-01-06 2022-01-08     2 2022-01-06 UTC--2022-01-08 UTC

如果可能的话,我想使用 ggplot 创建两个图:

  1. 第一个plot我想显示每个人的日期范围。更容易告诉你我的意思,看照片。

  2. 第二个图我想对每个组的范围进行平均并显示箱线图或类似图来显示每个组的日期分布。见照片。

有什么想法吗?我是新手所以画出我想要的东西,我希望它有帮助和清晰。

你可以用geom_segment

实现第一个情节
library(ggplot2)

ggplot(df, aes(x = start_date, y = name, colour = name)) +
  geom_segment(aes(xend = end_date, yend = name), colour = "black") +
  geom_point(size = 3) +
  geom_point(aes(x = end_date), size = 3) +
  theme_bw() +
  theme(legend.position = "none")

第二个需要一些数据重塑,正如 akrun 指出的那样:

library(dplyr)
library(tidyr)

df %>% 
  pivot_longer(2:3, names_to = "type", values_to = "date") %>%
  ggplot(aes(date, factor(group))) +
  geom_boxplot(aes(colour = factor(group))) +
  theme_bw() +
  theme(legend.position = "none")

reprex package (v2.0.1)

创建于 2022-01-22

当谈到第一个使用 geom_segment 的情节时,Allan 是完全正确的,我只是想补充一点,在 ggalt 包中实际上有一个 geom 可以准确地做到这一点。

它被称为哑铃图,看起来像这样:

这是我用来创建它的代码:

library(ggalt)
df %>%
  ggplot(
    aes(
      x = start_date,
      xend = end_date,
      y = name
    )
  ) +
  geom_dumbbell(
    colour = "#a3c4dc",
    colour_xend = "#0e668b",
    size = 4
  )

然后您可以使用所有正常功能使它看起来更漂亮。有关 geom_dumbbell 的更多信息可以通过帮助文档或 this blog post

找到