在R中基于T_plz列绘制带数值的密度地图求助
基于R数据框制作加权位置密度地图方案
已实现的案例位置密度图
你已经通过geom_density2d实现了基础位置密度图,代码如下:
stagr <- c(left = -4.65162, bottom = 37.13429, right = -4.55350, top = 37.21455) mapstagr_ter <- get_stamenmap(stagr, zoom = 13, maptype = "terrain") ggmap(mapstagr_ter) + geom_density2d(data = EH_GRA_B, aes(x = longitude, y = latitude), color = "navy", n = 150) ggsave("2.3.3.-EH_DENS_GRA.jpeg")
基于T_plz权重的位置密度图解决方案
你的需求是绘制关联T_plz列数值的加权密度图(即每个位置点的密度贡献由T_plz值决定,而非默认的等权重),以下是两种可行方案:
数据说明
你的数据框EH_GRA_B结构如下:
EH_GRA_B <- structure(list(T_plz = c(75L, 129L, 266L, 218L, 482L, 92L, 90L, 78L, 69L, 21L, 40L, 47L, 28L, 58L, 206L, 72L, 69L, 112L, 62L, 88L, 40L, 57L, 35L, 60L, 39L, 51L, 29L, 26L, 15L, 30L, 34L, 32L, 20L, 16L, 45L, 78L, 68L, 30L, 29L, 22L, 46L, 62L, 149L, 215L, 46L, 15L, 87L, 662L, 29L, 44L), longitude = c(-4.597636, -4.600515, -4.588572, -4.589938, -4.598265, -4.601427, -4.597413, -4.595821, -4.597891, -4.593336, -4.594576, -4.595756, -0.588499, -4.601454, -4.983123, -4.133705, -4.48927, -4.486673, -4.488118, -4.488586, -4.487734, -4.598726, -4.601972, -4.487957, -4.513919, -4.600738, -4.485894, -4.602229, -4.602794, -4.596575, -4.597923, -4.600733, -4.602358, -4.598863, -4.651686, -4.488492, -4.487467, -4.517984, -4.416325, -4.59916, -3.765086, -4.173191, -4.487102, -4.609372, -4.744296, -4.532488, -4.488932, -4.399515, -4.738974, -4.692104 ), latitude = c(37.177209, 37.172363, 37.169204, 37.174178, 37.173094, 37.172678, 37.176522, 37.172593, 37.173501, 37.17338, 37.175979, 37.176735, 37.176152, 37.174845, 37.018394, 37.299917, 36.918968, 36.918124, 36.918553, 36.918838, 36.91834, 37.173858, 37.177105, 36.917684, 36.743484, 37.174108, 36.917721, 37.176319, 37.177353, 37.173081, 37.173507, 37.173443, 37.18146, 37.178015, 37.230832, 36.918527, 36.91822, 36.745068, 36.701168, 37.175309, 37.493536, 36.748598, 36.918034, 37.176214, 36.735513, 36.725117, 36.703989, 37.095372, 36.735092, 36.736185)), row.names = c(NA, -50L), class = c("tbl_df", "tbl", "data.frame"))
方案一:使用stat_density_2d直接指定权重
ggmap结合stat_density_2d的weight参数可直接实现加权密度图,同时建议调整地图范围覆盖所有数据点:
# 计算所有数据的坐标范围 full_stagr <- c( left = min(EH_GRA_B$longitude), bottom = min(EH_GRA_B$latitude), right = max(EH_GRA_B$longitude), top = max(EH_GRA_B$latitude) ) # 获取覆盖全数据的底图 full_map <- get_stamenmap(full_stagr, zoom = 11, maptype = "terrain") # 绘制加权密度轮廓图 ggmap(full_map) + stat_density_2d( data = EH_GRA_B, aes(x = longitude, y = latitude, weight = T_plz, color = after_stat(level)), n = 150, size = 1 ) + scale_color_viridis_c(option = "plasma", name = "加权密度") + labs(title = "基于T_plz的加权位置密度图") # 保存图片 ggsave("2.3.3.-EH_WEIGHTED_DENS_GRA.jpeg", dpi = 300)
如果需要填充式密度图,可替换为stat_density_2d_filled:
ggmap(full_map) + stat_density_2d_filled( data = EH_GRA_B, aes(x = longitude, y = latitude, weight = T_plz), n = 150, alpha = 0.7 ) + scale_fill_viridis_d(option = "plasma", name = "加权密度区间") + labs(title = "基于T_plz的加权位置填充密度图")
方案二:手动计算加权核密度(更灵活)
用MASS包的kde2d手动计算加权密度,可实现更精细的控制:
library(MASS) # 手动计算加权核密度 weighted_kde <- kde2d( x = EH_GRA_B$longitude, y = EH_GRA_B$latitude, weights = EH_GRA_B$T_plz, n = 150, lims = full_stagr ) # 将密度结果转为数据框用于ggplot kdf <- data.frame( expand.grid(x = weighted_kde$x, y = weighted_kde$y), z = as.vector(weighted_kde$z) ) # 绘制底图+加权密度轮廓 ggmap(full_map) + geom_contour( data = kdf, aes(x = x, y = y, z = z, color = after_stat(level)), size = 1 ) + scale_color_viridis_c(option = "plasma", name = "加权密度") + labs(title = "手动计算的加权位置密度图")
注意事项
- 原数据中有一个异常经度值
-0.588499,建议检查是否为输入错误(应为-4.588499),否则会导致地图范围异常。 - 调整
zoom参数可控制地图缩放级别,根据数据分布选择合适值。
内容的提问来源于stack exchange,提问作者Jammoyano
相关产品推荐
相关产品推荐

