如何在ggplot2中按周分组绘制每小时温度数据?
如何在ggplot2中按周分组绘制每小时温度数据?
我完全懂你的需求啦——要把每周的小时温度数据对齐到同一时间轴上,对比不同周的温度变化,还得避开不合适的柱状图(毕竟温度数据从0开始展示确实不合理)。下面我一步步教你实现想要的效果:
第一步:先处理数据,统一时间轴
你的date列是字符格式,首先得转成可计算的时间类型,然后计算每个数据点和所在周起始时间(date2)的时间差,这样就能把所有周的时间轴统一成「相对于周开始的小时数」,完美对齐所有周的同一时段数据。
先加载需要的工具包,再处理数据:
# 加载必备包 library(tidyverse) library(lubridate) # 取消原数据的分组状态,方便后续处理 df <- ungroup(df) # 转换日期格式 + 计算相对小时数 df <- df %>% mutate( date = mdy_hms(date), # 把字符型日期转成POSIXct时间格式 hours_since_start = as.numeric(difftime(date, date2, units = "hours")) )
第二步:绘制符合需求的图
这里给你两种常用的方案,按需选择:
方案1:分面线图(推荐,每个周的趋势清晰独立)
把每个周的温度变化做成单独的小图,横向/纵向排列,方便对比不同周的时段趋势:
ggplot(df, aes(x = hours_since_start, y = mean_temperature, group = week)) + geom_line(color = "#2c3e50", linewidth = 0.8) + # 线图展示温度变化趋势 geom_point(color = "#e74c3c", size = 1.2) + # 点标记每个小时的具体数据 facet_wrap(~week, ncol = 5) + # 按周分面,设为5列,可根据需求调整数量 labs( x = "相对于周起始时间的小时数", y = "平均温度 (℃)", title = "每周每小时温度变化趋势" ) + theme_bw() + theme( strip.text = element_text(size = 10, face = "bold"), axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5, size = 14, face = "bold") )
方案2:单图多线(所有周在同一图中对比)
如果想把所有周的趋势放在同一个图里,用颜色区分不同周:
ggplot(df, aes(x = hours_since_start, y = mean_temperature, color = week, group = week)) + geom_line(linewidth = 0.7) + geom_point(size = 1) + labs( x = "相对于周起始时间的小时数", y = "平均温度 (℃)", title = "各周每小时温度变化对比", color = "实验周数" ) + theme_bw() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.text.x = element_text(angle = 45, hjust = 1) )
关键说明
- 计算
hours_since_start是核心:不管每个周的实际起始日期是什么,这个字段能把所有周的同一小时数据对齐到x轴的同一个位置,和你实验数据的x轴逻辑保持一致。 - 选择线图/点图完全适配你的数据:它们不需要从0开始展示,能准确反映温度随时间的变化趋势,避免柱状图带来的视觉误导。
备注:内容来源于stack exchange,提问作者Ahsk
相关产品推荐
相关产品推荐

