You need to enable JavaScript to run this app. ggplot2热图:基于衰减函数生成带抖动偏移的二维梯度矩阵实现方法
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2热图:基于衰减函数生成带抖动偏移的二维梯度矩阵实现方法

适配ggplot2的梯度衰减矩阵实现

按照你给出的衰减分档规则,用切比雪夫距离做分层计算,生成的结果完全可以直接传入ggplot2的geom_bin2d/geom_tile使用,不需要额外格式转换。
具体分档逻辑和你给出的示例完全对齐:

  • 以兴趣点为中心,每个格点计算到中心的切比雪夫距离(即横纵坐标差的最大值)
  • 距离为0(兴趣点本身):赋值5
  • 距离为1(相邻8个格):赋值3
  • 距离为2(外围第二层格):赋值1
  • 距离≥3:赋值0
# 初始6*6矩阵,兴趣点在第三行第三列(R为1开头的索引),赋值5
init_mat <- matrix(0, nrow = 6, ncol = 6)
init_mat[3, 3] <- 5

# 生成网格坐标,输出直接匹配ggplot的x/y列格式
grid <- expand.grid(x = 1:6, y = 1:6)
point_center_x <- 3
point_center_y <- 3

# 计算每个格子到兴趣点的切比雪夫距离,对应环形衰减档位
grid$cheb_dist <- pmax(abs(grid$x - point_center_x), abs(grid$y - point_center_y))

# 按示例档位赋值
grid$value <- dplyr::case_when(
  grid$cheb_dist == 0 ~ 5,
  grid$cheb_dist == 1 ~ 3,
  grid$cheb_dist == 2 ~ 1,
  .default = 0
)

# 转成矩阵查看结果,和你给出的第一版衰减示例逐格匹配
decay_strict <- matrix(grid$value, nrow = 6, ncol = 6)
带随机抖动的非对齐衰减生成

实现偏移效果的逻辑非常简单,不需要修改核心的衰减计算规则,只需要给衰减核的中心坐标加一个整数步长的随机偏移,同时加边界截断保证衰减核不会跑出6x6矩阵范围即可。
你给出的偏移参考效果,本质就是整个衰减核在列方向整体右移1格,中心从原(3,3)位置移到(3,4)位置,计算结果和示例逐格匹配。

# 加随机偏移,每次运行随机选-1、0、1的格点步长
jit_x <- sample(c(-1, 0, 1), 1)
jit_y <- sample(c(-1, 0, 1), 1)

# 边界截断,避免衰减核跑出矩阵被切割成不完整的图案
jit_x <- min(max(point_center_x + jit_x, 3), 4)
jit_y <- min(max(point_center_y + jit_y, 3), 4)

# 套用相同的距离计算逻辑生成抖动后的网格
grid_jit <- expand.grid(x = 1:6, y = 1:6)
grid_jit$cheb_dist <- pmax(abs(grid_jit$x - jit_x), abs(grid_jit$y - jit_y))
grid_jit$value <- dplyr::case_when(
  grid_jit$cheb_dist == 0 ~ 5,
  grid_jit$cheb_dist == 1 ~ 3,
  grid_jit$cheb_dist == 2 ~ 1,
  .default = 0
)

# 当jit_y=1时,生成的结果就和你贴的偏移示例完全一致

使用提示:

  • 生成的网格数据框默认列名为x/y/value,正好是ggplot几何函数默认识别的列名,写绘图代码的时候不需要手动调整参数映射
  • 如果觉得整数步长的偏移太生硬,完全可以把中心坐标换成带小数的随机值,算出来的衰减值是连续的,模糊效果会更自然,不会有硬邦邦的格点边界
  • 这套逻辑完全支持多兴趣点场景,只需要把每个兴趣点的衰减值叠加到网格上,就能生成多个兴趣点的组合热图效果

内容的提问来源于stack exchange,提问作者M. Wood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 20:06:04