R语言绘制日历热图

前言

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

什么是日历热图?

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

主要特点:

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

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

应用场景:

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

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

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

年视图

月视图

绘图所需数据

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

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

R语言绘制日历热图

# 来源 https://www.r2omics.cn/
library(tidyverse)        # 用于数据处理和可视化
library(ggTimeSeries)     # 提供时间序列相关的可视化函数
library(RColorBrewer)     # 提供调色板

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

# 数据处理:提取年份、月份和周数
df = df %>%
  mutate(Year = as.integer(strftime(Date, '%Y'))) %>%   # 提取年份
  mutate(month = as.integer(strftime(Date, '%m'))) %>%  # 提取月份
  mutate(week = as.integer(strftime(Date, '%W')))       # 提取周数

# 计算每个月的平均周数,并生成月份标签
MonthLabels = df %>%
  group_by(month) %>%                                    # 按月份分组
  summarise(meanWeek = mean(week)) %>%                    # 计算每个月的平均周数
  mutate(month=month.abb[month]) %>%                      # 将月份数字转换为缩写(如Jan, Feb等)
  data.frame()                                           # 将结果转换为数据框

# 绘制日历热图
ggplot(data=df, aes(date=Date, fill=Value)) +                # 设置日期和颜色填充映射
  stat_calendar_heatmap() +                                  # 绘制日历热图
  scale_fill_gradientn(colours=rev(brewer.pal(11, 'Spectral')))+ # 设置渐变色填充
  facet_wrap(~Year, ncol = 1, strip.position = "right") +    # 按年份分面,纵向排列
  scale_y_continuous(breaks=seq(7, 1, -1), labels=c("Mon","Tue","Wed","Thu","Fri","Sat","Sun")) + # 设置Y轴为星期天到星期一
  scale_x_continuous(breaks = MonthLabels[,"meanWeek"], labels = MonthLabels[, "month"], expand = c(0, 0)) + # 设置X轴标签为每月的平均周数
  labs(x="", y="") +                                        # 去除X和Y轴标签
  theme(panel.background = element_blank())                 # 去除背景