在R中制作带数值及无填充行列的热图
在R中制作带数值且包含无填充列/行的热图
我来帮你实现这个需求!结合tidyverse系列工具包(包含ggplot2、dplyr等),我们可以轻松做出满足要求的热图——既能在单元格内显示数值,还能指定某些列/行不应用填充效果。下面是完整的步骤和代码:
首先,先加载需要的工具包:
library(tidyverse) # 一站式数据处理+绘图工具集
1. 准备示例数据
根据你提供的内容,我先构造一个完整的示例数据集(你可以直接替换成自己的真实数据):
df <- tibble( Year = c(1999, 2000, 2001, 2002, 2003), Jan = c(116, 114, 124, 107, 121), Feb = c(127, 154, 134, 137, 142), Mar = c(202, 193, 194, 199, 205), Apr = c(229, 214, 202, 213, 220), May = c(253, 263, 256, 267, 260), Jun = c(271, 271, 270, 269, 272), Jul = c(271, 254, 270, 267, 270), Aug = c(245, 248, 243, 250, 247), Sep = c(212, 210, 212, 211, 215), Oct = c(174, 167, 176, 153, 170), Nov = c(133, 120, 128, 123, 130), Dec = c(115, 102, 108, 109, 112), Sum = c(2348, 2310, 2317, 2304, 2333) )
2. 数据格式转换(宽→长)
ggplot2需要长格式数据才能绘制热图,我们同时添加一个标记列,用来区分需要填充颜色的列(Jan-Dec)和不需要填充的列(Sum):
df_long <- df %>% pivot_longer(cols = -Year, names_to = "Month", values_to = "Value") %>% # 标记哪些列需要填充:Sum列设为FALSE,其余月份设为TRUE mutate(is_fill = ifelse(Month == "Sum", FALSE, TRUE))
3. 绘制符合要求的热图
核心思路是:仅对标记为is_fill == TRUE的单元格添加填充色,同时给所有单元格显示数值,最后调整样式让图表更美观:
ggplot(df_long, aes(x = Month, y = factor(Year))) + # 仅为月份列添加热图填充,白色边框区分单元格 geom_tile(data = filter(df_long, is_fill), aes(fill = Value), color = "white") + # 给所有单元格添加数值文本,控制大小和颜色 geom_text(aes(label = Value), size = 3.5, color = "black") + # 设置填充色渐变(这里用viridis色系,你也可以换成冷暖渐变的scale_fill_gradient2) scale_fill_viridis_c(option = "plasma", name = "数值大小") + # 调整坐标轴和标题 labs(x = "", y = "年份", title = "各月份数值热图(Sum列无填充)") + # 优化主题样式:去掉冗余网格,调整文本角度和位置 theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.text.y = element_text(size = 10), axis.text.x = element_text(size = 10, angle = 45, hjust = 1), legend.position = "right" )
效果说明
- 所有单元格都会清晰显示对应数值,不会被填充色遮挡
- Sum列没有填充色,和月份列形成明显区分,突出总和的特殊性
- 如果需要让某些行不填充(比如某一行是汇总行),只需要修改
is_fill的标记逻辑,把对应行设为FALSE即可
内容的提问来源于stack exchange,提问作者Jawairia
相关产品推荐
相关产品推荐

