You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于完成日期计算日期并绘制饮酒量热力图的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:42:32