R. ggplot 堆叠直方图,时间序列,结合两个小时图
R. ggplot Stacked histogram, Time series, combine two hour plots
我有一个堆叠直方图,它看起来像这样:
我有两个问题:
- 我想要 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")
- 我想按深度 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"))
我有一个堆叠直方图,它看起来像这样:
我有两个问题:
- 我想要 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")
- 我想按深度 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 可以在这里看到:
回答中心 = 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"))