如何为数据集不同列分别生成带单元格数值的分组热力图
R ggplot2 按列生成带单元格标注的双轴标签热力图
实现思路
- 先将宽格式数据集转换为长格式,让每个分组+数值变量的组合对应单独一行,适配ggplot2的绘图逻辑
- 以数值变量名为x轴、分组取值为y轴绘制热力图,天然实现按列排布的需求
- 配置坐标轴参数实现上下、左右双侧显示对应标签,同时添加单元格文本标注
完整代码
首先加载所需依赖包:
library(tidyverse)
使用你提供的示例数据集,先做数据重构再绘图:
# 示例数据集 df<-structure(list(group = c("1", "2", "3", "4", "5", "6", "7"), mean_eur = c(-129.567230632235, -22.2194324821243, 1342.96054365896, -902.330543160851, -1489.68836579957, 927.850034173604, 0.0678674942780786 ), mean_eur_abs = c(723.928762243989, 3769.9065702668, 6117.92527832234, 4047.2805615705, 6057.02130927563, 4124.27784143031, 5717.03080420487 ), nr_obs = c(1123, 12.7372802960222, 16.3672687465791, 15.9754010695187, 16.4488279016581, 16.0794132524026, 13.343143812709)), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame")) # 宽表转长表 df_long <- df %>% pivot_longer(cols = -group, names_to = "var_name", values_to = "value") # 绘制热力图 ggplot(df_long, aes(x = var_name, y = group, fill = value)) + # 绘制热力图单元格,设置白色边框区分 geom_tile(color = "white", linewidth = 1) + # 单元格内标注数值,保留2位小数可按需调整 geom_text(aes(label = round(value, 2)), color = "black", size = 3.5) + # 配置x轴(数值变量名)上下双侧显示标签 scale_x_discrete(position = "both") + # 配置y轴(分组取值)左右双侧显示标签 scale_y_discrete(position = "both") + # 数值渐变配色,可按需替换为其他配色方案 scale_fill_viridis_c() + # 标签配置,隐藏不必要的轴标题 labs(x = NULL, y = NULL, fill = "数值") + # 主题优化,去除网格线更美观 theme_minimal() + theme( axis.text = element_text(size = 11), panel.grid = element_blank() )
常用调整说明
- 单元格标注的小数位数:修改
geom_text中round(value, 2)的第二个参数即可 - 配色:将
scale_fill_viridis_c()替换为其他fill配色函数,比如scale_fill_gradient2(low = "blue", mid = "white", high = "red", midpoint = 0)适配正负值场景 - 单元格边框:修改
geom_tile的color(边框颜色)、linewidth(边框粗细)参数 - 文字大小:调整
geom_text的size参数、theme中axis.text的size参数
内容的提问来源于stack exchange,提问作者John Mayer
相关产品推荐
相关产品推荐

