如何在R中绘制事件?

nszi6y05  于 2023-01-03  发布在  其他
关注(0)|答案(2)|浏览(148)

我有这样的事件数据。第一列是事件名称。第二列是事件时间。多个事件用;分隔。我想在同一行中绘制同一事件的发生情况。事件名称显示在水平方向的Y轴上。时间显示在垂直方向的X轴上。事件时间也应该在每个事件处注解。我怎么用R来表示呢?

event1  14:30:00;16:30:00;17:15:00;18:30:00;19:30:00
event2  14:30:00
event3  13:45:00;15:15:00;17:15:00
event4  13:15:00;14:15:00;15:30:00;16:25:00;17:55:00;19:40:00
event5  21:00:00
event6  13:10:00;14:15:00;15:55:00;17:40:00
event7  16:45:00;18:15:00;20:30:00
event8  14:00:00;16:45:00;18:30:00
event9  15:00:00;17:45:00;20:00:00
event10 21:00:00
event11 13:00:00
event12 14:00:00;14:30:00;15:00:00;15:30:00;16:00:00;16:30:00;17:00:00;17:30:00;18:00:00;18:30:00;19:00:00;19:30:00;20:00:00
event13 14:00:00;14:25:00;15:10:00;15:25:00
event14 17:50:00;18:15:00;19:15:00;20:25:00;20:45:00
event15 14:15:00;16:00:00;17:15:00;18:45:00;19:45:00
event16 14:30:00;16:00:00;17:30:00
event17 19:15:00
svmlkihl

svmlkihl1#

使用tidyr::separate_rows()分隔第二列中的时间,然后转换为时间,按数字对第一列排序,并绘制:

library(tidyverse)
library(lubridate)

dat %>%
  separate_rows(time, sep = ";") %>%
  mutate(
    event = fct_reorder(event, as.numeric(str_extract(event, "\\d+"))),
    time = parse_date_time(time, orders = "HMS")
  ) %>%
  ggplot(aes(time, event)) +
  geom_point() +
  geom_text(
    aes(label = strftime(time, "%H:%M")), 
    angle = 30,
    size = 8 / .pt,
    hjust = 0,
    nudge_y = .25
  ) +
  scale_x_datetime(
    date_breaks = "1 hour",
    date_minor_breaks = "15 min",
    date_labels = "%H:%M"
  ) +
  scale_y_discrete(expand = expansion(add = c(.6, 1))) +
  theme_bw() +
  theme(
    axis.text.x = element_text(angle = 90, vjust = .5)
  )

mhd8tkvw

mhd8tkvw2#

作为tidyverse/ggplot2解决方案,您可以使用separate_rows的组合来分隔由分号分隔的不同事件时间,并将数据集从宽转换为长。

library(tidyverse)
library(lubridate)
library(scales)

df <- read_table("
event1  14:30:00;16:30:00;17:15:00;18:30:00;19:30:00
event2  14:30:00
event3  13:45:00;15:15:00;17:15:00
event4  13:15:00;14:15:00;15:30:00;16:25:00;17:55:00;19:40:00
event5  21:00:00
event6  13:10:00;14:15:00;15:55:00;17:40:00
event7  16:45:00;18:15:00;20:30:00
event8  14:00:00;16:45:00;18:30:00
event9  15:00:00;17:45:00;20:00:00
event10 21:00:00
event11 13:00:00
event12 14:00:00;14:30:00;15:00:00;15:30:00;16:00:00;16:30:00;17:00:00;17:30:00;18:00:00;18:30:00;19:00:00;19:30:00;20:00:00
event13 14:00:00;14:25:00;15:10:00;15:25:00
event14 17:50:00;18:15:00;19:15:00;20:25:00;20:45:00
event15 14:15:00;16:00:00;17:15:00;18:45:00;19:45:00
event16 14:30:00;16:00:00;17:30:00
event17 19:15:00", col_names = c("event", "time")) %>%
  separate_rows(time, sep = ";") %>%
  mutate(time = as.POSIXct(time, format = "%H:%M:%S")) %>%
  mutate(event = str_replace_all(event, "event", "")) %>%
  mutate(event = as.numeric(event))

df %>%
  ggplot(aes(x = event, # event number on x-axis
             y = time)) +  # time on y-axis
  geom_point() + 
  scale_x_continuous(breaks = breaks_pretty(n = 12)) +
  scale_y_datetime(breaks = breaks_pretty(n = 12)) # change 12 to something else if desired

相关问题