如何在R中使用facet_wrap按周七日分面可视化每小时平均数据
问题排查与修复方案
错误原因
- 分组逻辑错误:两次单独的
group_by会覆盖前一次分组,且你需要按「工作日(weekdays)+小时(hour)」同时分组才能计算每个工作日每小时的平均值,而不是按day列分组(示例中的day是日期序号,不是星期分类) - 语法缺失:
group_by(hour)后没有加管道符%>%,导致summarise没有承接前面的数据集运算 - 列引用错误:
summarise运算后只会保留分组列和新生成的avg_hour列,原数据的Value、weekdays列已经被汇总掉,ggplot里直接引用y=Value、color=weekdays自然找不到对应列 - 列缺失导致类型错误:因为前面的语法错误导致传入ggplot的数据集不存在hour列,R误调用了内置的
hour函数作为x轴映射,所以抛出「object of type function」的报错 - 未加分面语句:原代码没有添加
facet_wrap实现按工作日分面的需求
修复后完整代码
library(dplyr) library(ggplot2) # 先把weekdays转成有序因子,保证分面按周一到周日的顺序排列 df$weekdays <- factor(df$weekdays, levels = c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"), ordered = TRUE) # 分组汇总+绘图 df %>% group_by(weekdays, hour) %>% # 同时按工作日、小时分组 summarise(avg_hour = mean(Value), .groups = "drop") %>% # 汇总后自动取消分组 ggplot(aes(x = hour, y = avg_hour, color = weekdays)) + geom_line(linewidth = 1) + facet_wrap(~weekdays, nrow = 1) + # 按工作日分面 ylab("平均Value") + xlab("小时") + theme_bw()
效果说明
运行上述代码后,会生成7个分面,每个分面对应一个工作日,x轴是24小时,y轴是对应工作日对应小时的Value平均值,完全匹配需求。
内容的提问来源于stack exchange,提问作者Vahram
相关产品推荐
相关产品推荐

