R语言实现带地图背景的温度热力图失败问题咨询
问题原因排查
- geom_tile无显示的核心原因:
geom_tile要求数据为规则网格格式,你的原始数据是离散点位(经纬度未构成均匀网格),没有匹配的网格单元格坐标,因此无法渲染出瓦片图层;单独绘制空白也源于此。- 需检查
aes映射是否正确:必须明确指定x(经度)、y(纬度)、fill(温度),映射错误也会导致无显示。
- geom_raster报错原因:
geom_raster同样依赖规则网格结构,当你的经纬度离散且分布不均时,它无法自动生成连续网格,因此触发点位分布相关报错。
可行解决方案与推荐函数
针对离散点位的温度热力图需求,推荐以下几种实用方法:
1. 使用stat_density_2d实现加权热力图
适合结合温度权重展示区域热力密度,可直接基于离散点生成:
library(ggmap) library(ggplot2) # 假设数据框为df,包含lon(经度)、lat(纬度)、temp(温度)列 get_map(location = c(min(df$lon), min(df$lat), max(df$lon), max(df$lat)), maptype = "roadmap", source = "google") %>% ggmap() + stat_density_2d(data = df, aes(x = lon, y = lat, fill = stat(density), weights = temp), geom = "polygon", contour = TRUE, alpha = 0.6) + scale_fill_viridis_c(option = "plasma", name = "温度热力密度")
2. 插值生成规则网格后用geom_tile绘制
先用插值工具将离散点转换为规则网格,再用geom_tile渲染:
library(akima) library(ggplot2) library(ggmap) library(tidyr) # 生成经纬度网格序列 lon_seq <- seq(min(df$lon), max(df$lon), length.out = 100) lat_seq <- seq(min(df$lat), max(df$lat), length.out = 100) # 对温度进行插值 interp_temp <- interp(x = df$lon, y = df$lat, z = df$temp, xo = lon_seq, yo = lat_seq, linear = TRUE) # 转换为ggplot可用的数据框格式 interp_df <- as.data.frame(interp_temp) %>% pivot_longer(cols = -x, names_to = "y", values_to = "temp") %>% mutate(y = as.numeric(gsub("V", "", y))) %>% rename(lon = x, lat = y) # 绘制热力图 get_map(location = c(min(df$lon), min(df$lat), max(df$lon), max(df$lat)), maptype = "roadmap", source = "google") %>% ggmap() + geom_tile(data = interp_df, aes(x = lon, y = lat, fill = temp), alpha = 0.6) + scale_fill_gradient(low = "blue", high = "red", name = "温度")
注:插值会引入一定估计误差,可根据场景调整linear(线性)或cubic(三次)插值方式。
3. 用geom_point模拟热力效果
无需处理网格,直接通过点的颜色、大小映射温度,实现轻量化热力展示:
get_map(location = c(min(df$lon), min(df$lat), max(df$lon), max(df$lat)), maptype = "roadmap", source = "google") %>% ggmap() + geom_point(data = df, aes(x = lon, y = lat, color = temp, size = temp), alpha = 0.7) + scale_color_gradient(low = "green", high = "red") + scale_size(range = c(2, 8))
内容的提问来源于stack exchange,提问作者Davido
相关产品推荐
相关产品推荐

