R语言绘制日历热图

前言

本篇是R语言ggplot2包绘制日历热图的教程。

什么是日历热图?

日历热图是一种用于展示数据的可视化图表,它以日历的形式呈现一段时间内的数据分布情况,通常以颜色的深浅或不同的颜色代表不同的数据值或频率。日历热图能帮助用户快速识别时间序列数据中的模式、趋势和异常值,尤其是在日、周或月的粒度下进行数据展示时。

主要特点:

  1. 直观性:通过不同的颜色或色块填充日期,使得数据的高低一目了然。

  2. 时间维度:通常会以年份、月份和日期为单位,展示时间维度的连续数据。

应用场景:

  • 网站分析:展示某网站每天的访问量或用户行为数据。

  • 健康追踪:比如展示每天的步数、卡路里消耗等。

  • 金融数据:比如展示股票的每日涨跌幅度等。

年视图

月视图

绘图所需数据

包含两列数据,第一列是年月日日期,第二列是数值。

demo数据可以在这里下载https://www.r2omics.cn//res/demodata/calendar/data.txt

R语言绘制日历热图

# 来源 https://www.r2omics.cn/
library(tidyverse)        # 用于数据处理和可视化

# 读取数据文件
df = read.delim("https://www.r2omics.cn//res/demodata/calendar/data.txt")  # 读取数据文件,假设数据以制表符分隔

# 数据处理:提取日期相关的信息,并对数据进行整理
dfPlot = df %>%
  mutate(month = as.integer(strftime(Date, '%m'))) %>%              # 提取月份
  mutate(monthf = factor(month, levels=as.character(1:12),        # 将月份转换为有序因子(1月到12月)
                         labels=month.abb, ordered=TRUE)) %>%     # 月份缩写(如Jan, Feb等)
  mutate(week = as.integer(strftime(Date, '%W'))) %>%              # 提取周数
  mutate(weekday = as.integer(strftime(Date, '%u'))) %>%           # 提取星期几(1=星期一,7=星期日)
  mutate(weekdayf = factor(weekday, levels=(1:7),                 # 将星期几转换为有序因子
                          labels=(c("Mon","Tue","Wed","Thu","Fri","Sat","Sun")), ordered=TRUE)) %>% # 星期几缩写
  mutate(day = strftime(Date, "%d")) %>%                            # 提取日
  group_by(monthf) %>%                                             # 按月份分组
  mutate(monthweek=1+week-min(week)) %>%                            # 计算每个月的周数,周数从1开始
  ungroup()                                                       # 解除分组

# 绘制日历热图
ggplot(dfPlot, aes(weekdayf, monthweek, fill=Value)) +               # 设置星期几和月份周数为x、y轴,值填充颜色
  geom_tile(colour = "white") +                                      # 使用矩形格子绘制热图
  scale_fill_gradientn(colours= c("#e5eabf","#d6e685","#8cc665","#44a340","#1e6823"), # 设置颜色渐变
                       na.value = "#eeeeee") +                      # 设置缺失值的颜色
  geom_text(aes(label=day), size=2) +                                # 在热图格子中添加日期
  facet_wrap(~monthf ,nrow=3) +                                      # 按月份分面,分为3行
  scale_y_reverse() +                                               # 翻转y轴,使得周一位于顶部
  labs(x="", y="") +                                                 # 去除x、y轴标签
  theme_void() +                                                    # 移除所有背景元素
  theme(strip.text = element_text(size=13, face="plain", color="black"),  # 设置月份标签样式
        axis.text.x = element_text(size=10, face="plain", color="black"))  # 设置x轴文本样式