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

如何在ggmap上添加透明度随人口密度变化的热力图层?

问题描述

我用ggmap生成了加利福尼亚州地图,其中邮政编码按价值分为5个聚类并分配对应颜色。希望在地图上叠加一个基于人口密度(数据框字段名为density)的热力图层,要求图层透明度随人口密度动态变化。

尝试用stat_binhex()结合coord_cartesian()添加图层时,透明度始终固定为0.5,无法实现随密度动态变化的效果。

可复现数据框
library(ggmap)

stack_reduced_lng=c(-118.2495, -118.2467, -118.2737, -118.3108, -118.3065, -118.2942, -118.2849, -118.3471, -118.3158, -118.2587, -118.2382, -118.2403, -118.2665, -118.3546, -118.2643, -118.3172, -118.3387, -118.3099, -118.1561, -118.1999)

stack_reduced_lat=c( 33.97398, 33.94901, 33.96411, 34.07621, 34.05912, 34.04801, 34.02809, 34.00956, 34.06211, 34.00714, 34.06599, 34.04481, 34.03939, 34.02872, 34.05291, 34.02887, 34.04864, 34.06639, 34.02453, 34.02276)

stack_reduced_density=c(  6595.9,  6721.1,  8016.2,  7668.7, 14151.8, 11981.7,  6640.7,  3337.9,  3226.8, 10014.5,  4361.8,  7227.4,  5112.6,  4886.0, 14737.8,  7131.7,  6408.5, 13386.6,  5905.2,  4266.7)

stack_reduced_value.level=c( "Lower.Value",     "Lower.Value",     "Lower.Value",     "Upper.Mid.Value", "Middle.Value",    "Low.Mid.Value",  "Low.Mid.Value",   "Middle.Value",    "Middle.Value",    "Lower.Value",     "Low.Mid.Value",   "Middle.Value", "Middle.Value",    "Low.Mid.Value",   "Middle.Value",    "Low.Mid.Value",   "Middle.Value",    "Low.Mid.Value", "Low.Mid.Value",   "Low.Mid.Value")

df=as.data.frame(cbind(stack_reduced_lng, stack_reduced_lat, stack_reduced_density, stack_reduced_value.level))

colnames(df)=c("lng", "lat", "density", "value.level")
原始ggmap地图代码
# 定义地图中心点
la.center=c(lng=-118.2437, lat=34.0522)

# 创建颜色向量
map_colors=c("black", "yellow", "green", "blue", "red")

# 生成地图
socal_map=get_map(location=la.center, zoom=6, scale=4)
d=ggmap(socal_map)+
  geom_point(aes(x=lng, y=lat, color=as.factor(value.level)), data=df)

# 格式化地图
d=d+scale_color_manual(name="Home Value Level", 
                       breaks=c("Lower.Value","Low.Mid.Value","Middle.Value", "Upper.Mid.Value", "Upper.Value"), 
                       labels=c("Lower Home Value", "Lower Middle Home Value", "Middle Home Value", "Upper Middle Home Value", "Upper Home Value"), 
                       values=map_colors)+
  labs(x="Longitude", y="Latitude", title="Map of Home Values by Zip Code for California")
失败的尝试(无法实现动态透明度)
d+coord_cartesian()+stat_binhex(
  aes(x=lng, y=lat, fill=density),
  size=1, bins=20, alpha=0.5,
  data=df
)

这段代码能添加图层,但透明度始终固定为0.5,无法随人口密度变化。

解决方案

使用stat_density2d()函数可以实现透明度随人口密度动态变化的热力图层,代码示例如下:

d+stat_density2d(data=df, aes(x=lng, y=lat, fill=density, alpha=..level..),
                 geom="polygon", size=1, bins=15)+
  scale_alpha(range=c(0.1, 0.2))

注:原示例中data=cali.val.income.dat需替换为实际使用的数据框df。

最终生成的地图中,点会按价值聚类着色,热力图层的透明度会随人口密度动态调整。


内容的提问来源于stack exchange,提问作者dl4060

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:19:58