如何使用ggplot绘制以单元格覆盖面积表示强度的热图
ggplot2实现填充面积占比映射强度的类热图方案
你需要的这种不依赖色彩色相、靠单元内填充面积占比体现数值的类热图,可以通过「网格拆分+矩形映射」的方式实现,效果和参考示例完全一致,具体方案如下:
核心逻辑
- 先将所有网格单元的强度值归一化到0~1区间,数值直接对应单元内的填充面积占比
- 把每个原始网格单元拆分为N×N个等尺寸的微小方格,例如拆为10×10共100个小格时,占比显示精度可达1%,足够常规使用
- 每个原始单元内,按归一化后的占比选取对应数量的微小方格填充,剩余方格留空,统一绘制矩形即可出图
完整实现代码
首先加载需要的依赖包:
library(ggplot2) library(dplyr) library(tidyr)
先构造示例二维网格数据集,你使用时替换成自己的真实数据即可,保证数据里有网格x坐标、y坐标、对应强度值三列:
# 构造示例数据 set.seed(123) grid_data <- expand.grid(x = 1:10, y = 1:10) %>% mutate(value = runif(nrow(.), 0, 1)) # 替换value列为你自己的强度值
核心的网格拆分与填充标记逻辑:
# 配置每个原始单元拆分的微格数量,数值越大占比精度越高 n_grid <- 10 cell_size <- 1 / n_grid plot_data <- grid_data %>% group_by(x, y) %>% # 生成当前原始单元内所有微格的坐标 reframe( micro_x = rep(seq(0, 1 - cell_size, cell_size), n_grid) + x, micro_y = rep(seq(0, 1 - cell_size, cell_size), each = n_grid) + y, fill_count = round(first(value) * n_grid^2) ) %>% group_by(x, y) %>% # 随机选取对应数量的微格标记为填充状态 mutate(fill = row_number() %in% sample(1:n(), first(fill_count))) %>% ungroup()
绘图代码:
ggplot(plot_data) + # 绘制所有微格的浅灰色细边框,保证网格对齐 geom_rect( aes(xmin = micro_x, xmax = micro_x + cell_size, ymin = micro_y, ymax = micro_y + cell_size), fill = NA, color = "grey80", linewidth = 0.2 ) + # 仅绘制需要填充的微格,统一用黑色填充,无需色相映射 geom_rect( data = . %>% filter(fill), aes(xmin = micro_x, xmax = micro_x + cell_size, ymin = micro_y, ymax = micro_y + cell_size), fill = "black", color = NA ) + # 绘制原始大网格的黑色粗边框,区分每个数据单元 geom_hline(yintercept = 1:11, color = "black", linewidth = 0.5) + geom_vline(xintercept = 1:11, color = "black", linewidth = 0.5) + # 固定坐标比例,避免网格拉伸变形 coord_fixed() + theme_minimal() + theme( axis.text = element_text(size = 10), panel.grid = element_blank() )
效果调整说明
- 如果不需要随机分布填充块,想要实现从单元底部/左侧开始连续填充的效果,把标记填充逻辑里的
sample(1:n(), first(fill_count))替换为按micro_y/micro_x排序后取对应数量的行即可,呈现效果类似每个单元内置一个小柱状图 - 调整
n_grid的取值可以修改填充精度:数值越大占比显示越细腻,注意不要设置过高避免渲染卡顿,常规用10~20即可 - 填充颜色、网格线粗细、颜色都可以直接修改
geom_rect和geom_hline/geom_vline层的对应参数,适配自己的绘图风格 - 如果你的原始网格坐标不是连续整数,把绘制大网格线的
yintercept、xintercept参数替换为自己数据集的网格边界断点即可正常使用
内容的提问来源于stack exchange,提问作者TanZor
相关产品推荐
相关产品推荐

