You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:15:54