如何在RStudio中实现眼动数据热力图与背景图精准叠加?
解决方法
核心是让背景图的坐标范围完全匹配热力图的X/Y轴范围,同时保留图片原始宽高比,避免拉伸变形。
1. 提取热力图的坐标边界
从kde2d生成的结果中获取X、Y轴的极值,这是热力图的坐标系范围:
x_range <- range(dens11$x) y_range <- range(dens11$y)
2. 计算背景图的适配范围
根据背景图的宽高比,计算出适配热力图坐标范围的显示边界,确保图片比例不变:
im <- readPNG("F:/analysisdata/heatmap/original_resize/Nubmer_1.png") img_w <- ncol(im) img_h <- nrow(im) img_aspect <- img_h / img_w # 适配热力图X范围,计算对应的Y范围(保持图片比例) target_y <- c(y_range[1], y_range[1] + (x_range[2] - x_range[1]) * img_aspect) # 若需适配Y范围调整X范围,用下面的代码: # target_x <- c(x_range[1], x_range[1] + (y_range[2] - y_range[1]) / img_aspect)
3. 统一坐标系绘制叠加图
先绘制背景图,再叠加热力图,确保两者坐标完全对齐:
# 绘制空图,设置坐标范围为适配后的边界 plot(x_range, target_y, type = "n", xlab = "", ylab = "", asp = img_aspect) # 绘制背景图,坐标与空图完全匹配 rasterImage(im, x_range[1], target_y[1], x_range[2], target_y[2]) # 开启新图层 par(new = TRUE) # 绘制热力图,指定坐标范围与背景图一致,关闭坐标轴避免重复 image(dens11, col=heat.colors(n, rev=TRUE), xlim = x_range, ylim = target_y, axes = FALSE, xlab = "", ylab = "")
额外注意事项
- 如果眼动数据的X/Y坐标本来就是基于背景图的像素位置采集的,直接用
x_range <- c(0, img_w)、y_range <- c(0, img_h)即可,无需计算比例。 - 屏幕坐标系中Y轴通常从上到下递增,但
image()函数默认Y轴从下到上递增,若出现上下颠倒,用ylim = rev(target_y)反转Y轴即可。
内容的提问来源于stack exchange,提问作者Ziming Jin
相关产品推荐
相关产品推荐

