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
相关产品推荐
相关产品推荐

