基于完成日期计算日期并绘制饮酒量热力图的R技术问询
解决方案
以下是实现需求的完整R代码,包含数据处理和热力图绘制:
library(tidyverse) library(lubridate) # 原始数据集 df <- data.frame( id = 1:6, drinks_on_previous_day1 = c(5,4,2,1,5,4), drinks_on_previous_day2 = c(5,4,2,1,5,5), drinks_on_previous_day3 = c(5,4,2,1,5,6), drinks_on_previous_day4 = c(5,4,2,1,5,7), drinks_on_previous_day5 = c(5,4,2,1,5,8), completion_date = as.Date(c("2023-04-18 16:32:17", "2023-04-21 16:32:17", "2023-04-24 16:32:17", "2023-04-25 16:32:17", "2023-05-01 16:32:17", "2023-05-02 16:32:17")) ) # 数据处理:转换为长格式并计算对应日期 df_long <- df %>% pivot_longer( cols = starts_with("drinks_on_previous_day"), names_to = "day_num", values_to = "drinks" ) %>% # 提取天数数字(比如从drinks_on_previous_day1中提取1) mutate(day_num = as.numeric(str_extract(day_num, "\\d+"))) %>% # 计算对应的饮酒日期:完成日期减去对应天数 mutate(drink_date = completion_date - days(day_num)) %>% # 移除不需要的列 select(id, drink_date, drinks) # 绘制热力图 ggplot(df_long, aes(x = drink_date, y = factor(id), fill = case_when( drinks > 5 ~ "红色", drinks < 5 ~ "绿色", TRUE ~ "黄色" # 处理饮酒量等于5的情况,可根据需求调整 ))) + geom_tile(color = "white", size = 0.5) + scale_fill_manual(values = c("绿色" = "#2ecc71", "黄色" = "#f1c40f", "红色" = "#e74c3c")) + labs( x = "饮酒日期", y = "参与者ID", fill = "饮酒量等级", title = "参与者每日饮酒量热力图" ) + theme_minimal() + theme( axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5) )
步骤说明
数据转换与日期计算
- 使用
pivot_longer将宽格式数据转为长格式,把5个饮酒量列合并为day_num(天数标识)和drinks(饮酒量)两列 - 通过
str_extract提取day_num中的数字,结合completion_date计算出每个饮酒记录对应的具体日期drink_date - 清理冗余列,保留
id、drink_date和drinks核心字段
- 使用
热力图绘制
- 使用
ggplot2的geom_tile绘制热力图,行对应参与者ID,列对应饮酒日期 - 通过
case_when定义颜色规则:饮酒量>5设为红色,<5设为绿色,等于5设为黄色(可根据需求修改) - 调整坐标轴文本角度和标题样式,提升图表可读性
- 使用
内容的提问来源于stack exchange,提问作者Fatima
相关产品推荐
相关产品推荐

