如何在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
相关产品推荐
相关产品推荐

