R语言绘制旋转坐标热力图:解决图块间隙问题
解决旋转热力图空白并实现插值覆盖的方案
1. 对旋转后的数据进行插值补全
旋转后的坐标不再是规则矩形网格,直接用geom_tile会出现大量空白,因此需要先通过插值生成覆盖整个区域的密集网格数据:
方法1:使用akima包实现线性插值
# 安装并加载依赖包 install.packages("akima") library(akima) library(tidyr) # 生成目标范围内的密集坐标轴序列 x_seq <- seq(min(framefinal2$X), max(framefinal2$X), length.out = 500) y_seq <- seq(min(framefinal2$Y), max(framefinal2$Y), length.out = 500) # 对value字段进行线性插值 interp_data <- interp(x = framefinal2$X, y = framefinal2$Y, z = framefinal2$value, xo = x_seq, yo = y_seq, linear = TRUE) # 将插值结果转换为ggplot兼容的dataframe格式 interp_df <- as.data.frame(interp_data) interp_df <- pivot_longer(interp_df, cols = -x, names_to = "y", values_to = "value") interp_df$y <- as.numeric(gsub("y", "", interp_df$y))
方法2:使用fields包实现薄板样条插值(平滑度更高)
# 安装并加载依赖包 install.packages("fields") library(fields) # 创建覆盖目标区域的密集网格 grid <- expand.grid(X = seq(min(framefinal2$X), max(framefinal2$X), length.out = 500), Y = seq(min(framefinal2$Y), max(framefinal2$Y), length.out = 500)) # 拟合薄板样条插值模型并预测网格点的value值 tps_model <- Tps(framefinal2[, c("X", "Y")], framefinal2$value) grid$value <- predict(tps_model, grid)
2. 绘制无空白的旋转热力图
用ggplot2绘制静态热力图
插值后的规则网格数据可直接用geom_raster铺满绘图区域,支持平滑过渡:
library(ggplot2) ggplot(interp_df, aes(x = x, y = y, fill = value)) + geom_raster(interpolate = TRUE) + # 开启绘图阶段的像素平滑 scale_fill_viridis_c() + # 可选的配色方案,也可替换为其他配色 theme_minimal()
用plotly绘制交互式热力图
如果需要交互式查看功能,可使用plotly直接调用插值后的网格数据:
install.packages("plotly") library(plotly) library(viridis) plot_ly(x = x_seq, y = y_seq, z = interp_data$z, type = "heatmap", colors = viridis(256), hoverinfo = "x+y+z")
用base R的raster包绘制栅格热力图
install.packages("raster") library(raster) library(viridis) # 将插值数据转换为栅格对象 r <- raster(interp_data) # 绘制热力图 plot(r, col = viridis(256), main = "旋转插值热力图")
关键说明
- 插值时的
length.out参数可按需调整:数值越大,生成的网格越密集,图像平滑度越高,但计算耗时也会增加 - 若原始数据存在缺失值,需先通过
na.omit(framefinal2)处理后再进行插值 ggplot2中geom_raster的interpolate = TRUE参数,会在绘图阶段对相邻像素做平滑处理,让热力图颜色过渡更自然
内容的提问来源于stack exchange,提问作者shghm
相关产品推荐
相关产品推荐

