我有一张加利福尼亚州的 ggmap。邮政编码从下到上按簇排列,总共五个簇,并根据簇分配颜色。我想做的是根据人口密度在其上放置一个热图图层,但目前我无法做到这一点。
我知道我需要根据人口密度(在数据框中简称为密度)改变 alpha,但我不知道具体该怎么做。
任何帮助将不胜感激。我在地图上有该图层,但 alpha 是恒定的,而不是根据人口密度而变化。
这是我的代码:
首先,生成可用的数据框:
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的代码:
#### First, our center
la.center=c(lng=-118.2437, lat=34.0522)
#### We will create a vector of colors, to be names and used in all project maps.
map_colors=c("black", "yellow", "green", "blue", "red")
#### creating our map
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)
#ggtitle("Map of Home Values By Zip Code For California")
#### Formatting the map
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="Longititude", 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
)
这会向我的地图添加一个图层,但 alpha 恒定为 0.5,因此它不会随密度变化,这正是我想要的。它生成的地图上有一个恒定层,即 alpha 级别,它应该随密度而变化。
非常感谢任何帮助。
谢谢!
你就快到了。主要问题是您的密度值是字符串。另外,您将
fill
声明为密度,但我猜您希望将其作为 value.level?不管怎样,这都会给你一个起点。
请注意,我没有 API 密钥,因此这是一个通用解决方案。如果这对您有用,请在下面评论。
library(ggplot2)
# Convert density to integers
df$density <- as.numeric(df$density)
ggplot() +
coord_cartesian() +
stat_binhex(data = df,
aes(x = lng, y = lat,
fill = value.level,
alpha = density),
# size = 1, # No discernible difference, may throw "deprecated" warning
bins = 20) +
scale_alpha_continuous(range=c(0.1, 0.5)) +
scale_fill_manual(values = c("#CC79A7", "#0072B2", "#E69F00", "#999999"))