R. ggplot 堆叠直方图,时间序列,结合两个小时图

R. ggplot Stacked histogram, Time series, combine two hour plots

我有一个堆叠直方图,它看起来像这样:

我有两个问题:

  1. 我想要 24 列,而不是 25 列 - 所以我需要以某种方式组合第一列和最后一列。 st_time 是 6 个月内从日期时间列中剥离的时间,输出为 POSIXct 2021-10-11 00:00:00 到 2021-10-11 23:59:54
All_M_dives$st_time <- format(as.POSIXct(All_M_dives$begdesc, format = "%d/%m/%Y %H:%M:%S"), format = "%H:%M:%S")
All_M_dives$st_time <- as.POSIXct(All_M_dives$st_time, format = "%H:%M:%S")
  1. 我想按深度 0,25,50,100,200 手动排序堆栈。 R 按字母顺序执行此操作,因此您可以在图例/图表中看到错误的顺序。

我想可能有一个解决方案,只使用按字母顺序排列的 dbins,如果可能的话,只重命名图例,我只是想到了。

gg <- ggplot(data = All_M_dives, aes(x = st_time, fill = dbins)) + 
  geom_histogram(colour = "black", position = "stack", binwidth = 3600 ) +
  scale_x_datetime(date_labels = "%H:%M") +
  labs(title = NULL, x = "Time of Day", y = "Dive Count") +
  theme(legend.position = "none") +
  theme_classic() + theme(axis.text.x = element_text(angle=45)) 
gg

dput 可以在这里看到: dbin 的细微变化现在是 dbins 和图中所示的值。

回答中心 = 1800 和因子分贝:

我认为最简单的解决方法是将 center = 1800 添加到 geom_histogram 行。这将使每个 bin 的宽度为 3600 秒,并且跨越以 1800 秒为中心的整个小时。

fake <- data.frame(st_time = as.POSIXct("2021-10-12", tz = "GMT") + runif(1E5, max = 24*60*60),
                   dbins = sample(LETTERS[1:5], 1E5, replace = TRUE, prob = c(20, 2, 1, 5, 5)))

ggplot(data = fake, aes(x = st_time, fill = dbins)) + 
  geom_histogram(colour = "black", position = "stack", binwidth = 3600, center = 1800 ) +
  scale_x_datetime(date_labels = "%H:%M") +
  labs(title = NULL, x = "Time of Day", y = "Dive Count") +
  theme(legend.position = "none") +
  theme_classic() + theme(axis.text.x = element_text(angle=45)) 

您也可以自己进行装箱并将其输入 ggplot 以使用 geom_col,对于相同的图:

library(dplyr); library(lubridate)
fake %>%
  count(st_time = floor_date(st_time, "hour"), dbins) %>%
ggplot(aes(x = st_time + 1800, y = n, fill = dbins)) + 
  geom_col(colour = "black", position = "stack", width = 3600) +
  scale_x_datetime(date_labels = "%H:%M") +
  labs(title = NULL, x = "Time of Day", y = "Dive Count") +
  theme(legend.position = "none") +
  theme_classic() + theme(axis.text.x = element_text(angle=45)) 

要更改序列顺序,我建议将 dbins 变量转换为有序因子。添加此行会将排序和绘图顺序更改为我提供的顺序:

fake$dbins = factor(fake$dbins, levels = c("D", "A", "E", "B", "C"))