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

如何在R中降低热图分辨率,对x、y变量分箱并保留强度信息?

R细粒度热图分箱降分辨率方案

针对2000x2000粒度的xy坐标数据,可通过二维分箱聚合强度值的方式降低热图分辨率,同时保留整体强度分布特征,以下是两种可直接复用的实现方式:

方式1:提前手动分箱(可控性最高)

先对x、y轴坐标做分箱分组,再按组聚合强度值,后续基于分箱后的数据绘图即可。

步骤1:数据分箱处理

需加载dplyr做数据处理,可自定义分箱大小和聚合规则:

library(dplyr)
library(ggplot2)
library(scales)

# 自定义分箱大小,2代表2x2的原始格子合并为1个,可按需调整
bin_size <- 2

avgS4_binned <- avgS4 %>%
  mutate(
    # x轴分箱,floor代表箱起始值为bin_size的整数倍,也可替换为round/ceiling调整对齐规则
    x_bin = floor(variable / bin_size) * bin_size,
    # y轴分箱规则和x轴保持一致
    y_bin = floor(V1 / bin_size) * bin_size
  ) %>%
  group_by(x_bin, y_bin) %>%
  summarise(
    # 聚合规则:需要求和用sum,需要平均强度用mean,可按需替换为median、max等
    binned_value = sum(value, na.rm = TRUE),
    .groups = "drop"
  )

按你给出的示例数据计算,上述代码会将(1,1)、(1,2)、(2,1)、(2,2)四个点聚合为一个分箱,对应强度值为3+4+5+5=17,和你预期的计算结果完全一致。

步骤2:用分箱后的数据绘图

仅需替换原有代码的映射字段即可:

ggplot(avgS4_binned) + 
  geom_tile(aes(x = x_bin, y = y_bin, fill = binned_value)) +
  scale_fill_viridis(option = "magma", direction = 1, limits = c(58000,63000),
        oob = squish) +
  scale_y_reverse()

方式2:直接用ggplot内置分箱函数(无需提前处理数据)

如果不需要单独保留分箱后的数据集,可直接使用geom_bin_2d在绘图时自动完成分箱聚合:

ggplot(avgS4, aes(x = variable, y = V1, z = value)) + 
  geom_bin_2d(
    binwidth = c(2,2), # 分别设置x、y方向的分箱宽度
    fun = sum # 指定聚合函数,和手动分箱的规则保持一致
  ) +
  scale_fill_viridis(option = "magma", direction = 1, limits = c(58000,63000),
        oob = squish) +
  scale_y_reverse()

注意事项

  • 分箱大小可灵活调整:针对2000x2000的原始数据,将bin_size设为10即可将热图分辨率降到200x200,大幅提升渲染速度和图案关联性
  • 原始数据不会被修改:分箱仅作用于绘图用的衍生数据集,原始细粒度数据可单独存储,不会丢失
  • 聚合规则可按需调整:如果需要反映分箱内的平均强度,将sum替换为mean即可

内容的提问来源于stack exchange,提问作者MonkeyArrow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:15:02