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

如何用geom_tile在热力图每列中可视化多变量?

这个需求完全可以实现!核心问题是把你的宽格式数据转成长格式,然后通过调整位置让不同变量的tile在同一个日期单元格里拆分展示,我给你两种常用的解决方案,你可以根据偏好选择:

方法1:同一日期单元格内左右拆分(横向展示多变量)

这个方法适合对比同一日期下不同变量的数值,让它们在同一日期位置并排展示:

  1. 先把宽数据转成长格式
    用tidyr::pivot_longer把v1、v2这类变量列转成variable(变量名)和value(数值)两列,这是ggplot处理多变量的标准操作:
library(tidyverse)

# 假设你的数据集叫df,转成长格式
df_long <- df %>%
  pivot_longer(cols = starts_with("v"),  # 匹配所有以v开头的变量列
               names_to = "variable",    # 存储变量名的新列
               values_to = "value")      # 存储变量对应数值的新列
  1. 调整x轴位置实现并排展示
    我们把日期转换成数值,给不同变量的x坐标加一个微小偏移量,再设置tile的宽度,就能让它们在同一日期位置并排不重叠:
ggplot(df_long, 
       aes(x = as.numeric(date) + case_when(variable == "v1" ~ -0.2,
                                            variable == "v2" ~ 0.2),  # 给v1/v2分别设置偏移
           y = factor(year),  # 把年份转成因子,作为y轴分组
           fill = value)) +
  geom_tile(width = 0.4, height = 0.8) +  # 设置tile宽高,避免重叠
  # 把x轴刻度还原成日期格式
  scale_x_continuous(breaks = as.numeric(df$date),
                     labels = format(df$date, "%m-%d")) +
  scale_fill_viridis_c(option = "plasma") +  # 可选:用渐变配色提升可读性
  labs(x = "日期", y = "年份", fill = "数值") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # 旋转x轴标签,避免拥挤
方法2:同一日期单元格内上下拆分(纵向展示多变量)

如果更习惯纵向拆分,也就是每个年份行下面再细分变量行,可以用interaction()把年份和变量组合成y轴变量:

ggplot(df_long,
       aes(x = date,
           y = interaction(year, variable),  # 组合年份和变量作为y轴分组
           fill = value)) +
  geom_tile(height = 0.8) +
  # 把y轴标签还原成年份,去掉变量后缀
  scale_y_discrete(labels = function(x) str_split(x, "\\.") %>% map_chr(1)) +
  scale_fill_viridis_c(option = "mako") +
  labs(x = "日期", y = "年份", fill = "数值") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

补充说明

你之前尝试叠加geom_tile失败,大概率是因为直接用了宽数据叠加(比如geom_tile(aes(fill=v1)) + geom_tile(aes(fill=v2))),这样两个tile会完全重叠,看不到下层内容。转成长格式后,ggplot能自动区分不同变量,再通过位置调整就能实现拆分效果。

如果你的变量不止v1、v2,方法1可以改成自动计算偏移量,适配任意数量的变量:

df_long <- df_long %>%
  group_by(date, year) %>%
  mutate(var_idx = row_number(),
         total_vars = n()) %>%
  ungroup() %>%
  mutate(x_offset = (var_idx - (total_vars + 1)/2) * 0.4)  # 自动生成均匀偏移

之后把x坐标改成as.numeric(date) + x_offset,tile宽度设为0.4即可,所有变量会自动均匀排列。

内容的提问来源于stack exchange,提问作者user3231352

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:34:19