绘制 R 中 facet wraps 中每个组的平均数据(显示 geom_smooth)

Posted

技术标签:

【中文标题】绘制 R 中 facet wraps 中每个组的平均数据(显示 geom_smooth)【英文标题】:Plot mean data for each group in facet wraps in R (show geom_smooth) 【发布时间】:2021-12-20 19:01:38 【问题描述】:

我有“日期”、“小时”、“日”、“工作日”、“值”的时间序列数据。 我想以某种方式对数据进行分组,以便为​​我提供每个工作日(星期一、星期二等)的平均值图,但以某种方式计算特定日期的平均值。例如在星期一的图中,平均值应该是数据集中所有星期一的平均值。

数据:

structure(list(Date = structure(c(1482087600, 1482084000, 1482080400, 
1482076800, 1482073200, 1482069600, 1482066000, 1482062400, 1482058800, 
1482055200, 1482051600, 1482048000, 1482044400, 1482040800, 1482037200, 
1482033600, 1482030000, 1482026400, 1482022800, 1482019200, 1482015600, 
1482012000, 1482008400, 1482004800, 1482001200, 1481997600, 1481994000, 
1481990400, 1481986800, 1481983200, 1481979600, 1481976000, 1481972400, 
1481968800, 1481965200, 1481961600, 1481958000, 1481954400, 1481950800, 
1481947200, 1481943600, 1481940000, 1481936400, 1481932800, 1481929200, 
1481925600, 1481922000, 1481918400), class = c("POSIXct", "POSIXt"
), tzone = ""), hour = c(23L, 22L, 21L, 20L, 19L, 18L, 17L, 16L, 
15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 
1L, 0L, 23L, 22L, 21L, 20L, 19L, 18L, 17L, 16L, 15L, 14L, 13L, 
12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L), day = c(18L, 
18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 
18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 17L, 17L, 17L, 
17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 
17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L), week = c(51, 51, 51, 
51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 
51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 
51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51), weekdays = c("Sunday", 
"Sunday", "Sunday", "Sunday", "Sunday", "Sunday", "Sunday", "Sunday", 
"Sunday", "Sunday", "Sunday", "Sunday", "Sunday", "Sunday", "Sunday", 
"Sunday", "Sunday", "Sunday", "Sunday", "Sunday", "Sunday", "Sunday", 
"Sunday", "Sunday", "Saturday", "Saturday", "Saturday", "Saturday", 
"Saturday", "Saturday", "Saturday", "Saturday", "Saturday", "Saturday", 
"Saturday", "Saturday", "Saturday", "Saturday", "Saturday", "Saturday", 
"Saturday", "Saturday", "Saturday", "Saturday", "Saturday", "Saturday", 
"Saturday", "Saturday"), Online_h = c(18L, 20L, 25L, 29L, 31L, 
32L, 30L, 23L, 24L, 17L, 15L, 15L, 10L, 9L, 7L, 7L, 9L, 12L, 
16L, 16L, 23L, 25L, 25L, 35L, 38L, 44L, 39L, 32L, 28L, 30L, 23L, 
22L, 21L, 14L, 13L, 15L, 12L, 6L, 7L, 6L, 7L, 7L, 11L, 14L, 21L, 
27L, 29L, 34L)), row.names = c(NA, 48L), class = "data.frame")

我当前的代码如下所示:

df%>%
  group_by(day) %>%
  group_by(hour) %>%
  mutate(avg_hour = mean(Value)) %>%
  ggplot(aes(x=hour, y=avg_hour)) + 
  geom_line() + 
  ylab("Available drivers") + 
  xlab("Hours") +
  facet_wrap(vars(weekdays))

这个图表的结果。

但是,平均线似乎在所有天数中都相同,但如果对每组天数进行计算,则应该会有所不同。谁能帮助我正确地找到每个组的方法并将其显示在图上? 提前谢谢你。

【问题讨论】:

试试ggplot(aes(..., group = weekdays))。另外,简化为group_by(day, hour) 是的,错误在 group_by(hour) 中,它将 (IIRC) 替换日期分组。 好的,它有帮助,但是在这样做之后我收到的平均值高于列中的最大值,这可能是什么原因以及为什么我会收到这样的数据? 您发布的数据集只有一周中的一天。您能否更新它以包含您的完整数据(或完整数据的具有一定代表性的样本)。这样我们就能更轻松地为您提供帮助。 @KeneDavidNwosu 我刚刚更新了问题中的数据以包括 2 天。 【参考方案1】:

您的group_by 呼叫不应这样分开。

编辑:我注意到您在数据集中每小时只有一小时,因此不清楚您想要找到...的平均值是什么

library(tidyverse)

df %>%
  group_by(weekdays, hour) %>%
  mutate(avg_drivers_online_per_hour = mean(Online_h)) %>%
  group_by(weekdays) %>% 
  mutate(avg_drivers_online_per_weekday = mean(Online_h)) %>% 
  ggplot() + 
  geom_line(aes(x=hour, y=avg_drivers_online_per_hour)) + 
  geom_segment(aes(x = 0, xend = 24, y = avg_drivers_online_per_weekday, yend = avg_drivers_online_per_weekday), color = "dodgerblue2") +
  ylab("Available drivers") + 
  xlab("Hours") +
  facet_wrap(vars(weekdays))

由reprex package 创建于 2021-11-08 (v2.0.1)

【讨论】:

以上是关于绘制 R 中 facet wraps 中每个组的平均数据(显示 geom_smooth)的主要内容,如果未能解决你的问题,请参考以下文章

R语言可视化包ggplot2包使用facet_wrap绘制多面板图(子图)实战

使用 facet_grid 或 facet_wrap 根据组的最大值和最小值独立修复 y_scale

为 R 中的 facet_wrap 直方图的每个图分配自定义颜色 - ggplot

facet_wrap 添加 geom_hline

facet_wrap 添加 geom_hline

在 R 的 ggplot2 中一起使用 stat_function 和 facet_wrap