使用 stat_binhex() 和 coord_cartesian() 在 R 中现有 ggmap 上分层热图时出现问题

问题描述 投票:0回答:1

我有一张加利福尼亚州的 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 级别,它应该随密度而变化。

非常感谢任何帮助。

谢谢!

r heatmap ggmap
1个回答
0
投票

你就快到了。主要问题是您的密度值是字符串。另外,您将

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"))

© www.soinside.com 2019 - 2024. All rights reserved.