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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:39:19