问题 | 用R语言进行克里金插值预测后,预测结果可视化做出一个平滑的热图,而不是像素感很重的网格热图
【代码】问题 | 用R语言进行克里金插值预测后,预测结果可视化做出一个平滑的热图,而不是像素感很重的网格热图。
·
- 以下是使用R语言进行克里金插值预测后生成平滑热图的步骤指南:
1. 提升克里金插值网格分辨率
- 在克里金预测阶段生成更密集的网格,从根本上减少像素感。
library(gstat)
library(sp)
library(raster)
# 假设已有空间数据框`data`,包含坐标(x,y)和变量(z)
coordinates(data) <- ~x + y
# 创建高分辨率网格(调整n=100为更高值,如n=200)
grid <- expand.grid(
x = seq(min(data$x), max(data$x), length.out = 200),
y = seq(min(data$y), max(data$y), length.out = 200)
)
gridded(grid) <- ~x + y
# 执行克里金插值(以普通克里金为例)
krig_result <- krige(z ~ 1, data, newdata = grid, model = vgm_model)
2. 转换为栅格对象并进行平滑处理
- 将插值结果转换为栅格格式后应用平滑滤波器。
# 将预测值转换为栅格
krig_raster <- raster(krig_result, layer = "var1.pred")
# 高斯平滑滤波(调整sigma控制平滑强度)
library(terra)
krig_smoothed <- terra::focal(
rast(krig_raster),
w = matrix(1, 5, 5), # 5x5窗口
fun = function(x) mean(x, na.rm = TRUE)
)
# 转换回数据框用于ggplot绘图
smoothed_df <- as.data.frame(krig_smoothed, xy = TRUE)
3. 使用ggplot2绘制平滑热图
- 通过
geom_raster
或geom_tile
结合插值参数优化可视化。
library(ggplot2)
ggplot() +
geom_raster(
data = smoothed_df,
aes(x = x, y = y, fill = lyr.1),
interpolate = TRUE # 关键参数,启用插值抗锯齿
) +
scale_fill_viridis_c(option = "plasma", name = "预测值") +
coord_fixed() +
theme_minimal() +
labs(title = "平滑克里金插值热图")
4. 替代方案:等高线填充图
- 使用
geom_contour_filled
生成平滑的等值区域图。
ggplot(smoothed_df, aes(x = x, y = y, z = lyr.1)) +
geom_contour_filled(bins = 30) + # 调整bins控制平滑度
scale_fill_viridis_d(option = "magma", name = "预测区间") +
coord_fixed() +
theme_minimal()
关键参数说明
参数/函数 | 作用 | 推荐值 |
---|---|---|
expand.grid(length.out) |
控制网格分辨率 | 200-500(依数据范围调整) |
focal(w) |
平滑窗口大小 | 5x5 或 7x7 |
geom_raster(interpolate) |
启用颜色插值消除锯齿 | TRUE |
geom_contour_filled(bins) |
控制等值线密度 | 20-50 |
效果对比
- 原始低分辨率网格:明显像素块,边界锯齿状。
- 高分辨率+平滑滤波:颜色过渡自然,无突兀网格线。
- 等高线填充:平滑的区域划分,适合展示趋势。
- 选择方法时需权衡计算成本与可视化需求。若需快速预览,可优先启用
interpolate=TRUE
;若追求出版级图形,建议结合高分辨率网格与后处理平滑。
更多推荐
所有评论(0)