R语言热力图实现需求:点密集区设为红色,空白区设为蓝色
将点地图转换为热力图的解决方案
首先修正原代码中的一处小问题:你定义的变量是pv,但在创建dat1时误用了city,需要替换为pv以避免报错。
接下来我们基于ggplot2的核密度估计功能实现热力图,让点密集区域显示红色、空白区域显示蓝色。以下是修改后的完整代码:
library(tidyverse) library(rnaturalearth) library(rnaturalearthhires) BRA <- ne_states( country = 'Brazil', returnclass = 'sf' ) SP <- BRA[BRA$name_en == "São Paulo", ] pv <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI") lat <- c(-23.52930049225196, -22.78331698013921, -20.541233056028002, -23.734103743283697, -20.81422401709715, -23.46021280316764, -23.089823347098537, -22.566093157661058, -23.499929950832037, -23.4995629706946, -21.839674720627357, -22.502281332972192, -20.031620630731723, -22.291436423446793, -22.119199798047937, -23.490731337547388, -21.97149754669437, -21.599485041360634, -21.205770335401102, -23.541710049999992, -23.45507023133906, -20.584950881524634, -15.32582591149114, -22.977804504826633, -22.367353815188075, -23.479082320220865, -23.76560073496052, -23.513253893618405, -21.16997037155122, -17.79009841494064, -22.90889180993712, -23.487005349783544, -16.324591284711158, -23.94363923416218) lon <- c(-46.56640074294553, -45.19337166646478, -48.575447765010075, -46.57989152769541, -49.519226907240885, -47.475877520132805, -45.51948770419383, -47.42089079365687, -47.45645468398622, -46.62762674039795, -47.47595663591126, -48.70889390801834, -50.727563046759705, -48.55949071145823, -51.40084275157352, -47.46717246210929, -46.79463584602512, -48.36108319953786, -50.44267199310968, -46.57118782780415, -46.52037744189376, -47.86603478808005, -49.117246403227426, -49.86555148857337, -46.943777559670785, -46.7417360477412, -46.37781898289404, -46.56538905635622, -47.814964992405606, -50.92576344342757, -47.068189856873516, -47.44645212858951, -48.95052196467507, -46.270547211146415) # 修正变量名错误 dat1 <- data.frame(pv, lat, lon) ggplot() + geom_sf(data = BRA, fill = "grey95") + geom_sf(data = SP, color = "black", fill = "white") + # 生成连续热力图填充层,基于经纬度的核密度估计 stat_density_2d( data = dat1, aes(x = lon, y = lat, fill = after_stat(density)), geom = "raster", contour = FALSE, alpha = 0.7 ) + # 设置颜色映射:低密度(空白区)为蓝色,高密度(密集区)为红色 scale_fill_gradient(low = "blue", high = "red") + theme_light() + labs(x = "Longitude", y = "Latitude", fill = "点密度") + ylim(-25,-10) + xlim(-55,-40)
关键修改说明:
- 替换原
geom_point为stat_density_2d,使用raster几何对象生成连续的颜色填充,关闭等高线让热力效果更直观 - 通过
scale_fill_gradient指定颜色渐变规则,完全匹配你“密集红、空白蓝”的需求 - 调整
alpha参数让热力层不会完全覆盖底层地图边界,保证地理信息可见
内容的提问来源于stack exchange,提问作者Thiago_Alvarenga
相关产品推荐
相关产品推荐

