这是一个“有趣”的包,它对生成底层 shapefile 的博客文章代码没有太多附加值(但包作者认为不适合在包中归功于博客文章的作者DESCRIPTION
,只是一个大头针-on 到 README 的末尾)。
作者还认为不适合做的一件事是为除 choropleths 之外的任何东西提供支持。您的问题是地图在一个坐标系中,而您的点在另一个坐标系中。
如果您可以使用非 CRAN 包albersusa
(在作者使用 copypasta 包之前存在一段时间),则提供了必要的胶水:usamap
library(albersusa) # https://gitlab.com/hrbrmstr/albersusa / https://github.com/hrbrmstr/albersusa
library(ggplot2)
library(sp)
获取预先投影的美国地图:
us <- usa_composite(proj = "aeqd")
我们将使用内置的“state.center”数据来获得一些分数
states_centers <- as.data.frame(state.center)
states_centers$name <- state.name
但是,如果您在 state.center 上查找帮助,您会发现他们不提供阿拉斯加和夏威夷的合法坐标,我们不能使用它们:
states_centers <- states_centers[!(states_centers$name %in% c("Alaska", "Hawaii")),]
注意:如果您在阿拉斯加/夏威夷确实有积分,您需要在包中设置 'points_elided() 函数来修改任何阿拉斯加或夏威夷积分。一个长期存在的 TODO 一直是points_elided()
支持所有转换,但我几乎不需要在 choropleths 之外使用包,所以它会在一段时间内成为 TODO。
现在,通过从直长/纬度到投影坐标系,使它们成为我们地图的合法坐标:
coordinates(states_centers) <- ~x+y
proj4string(states_centers) <- CRS(us_longlat_proj)
states_centers <- spTransform(states_centers, CRSobj = CRS(us_aeqd_proj))
states_centers <- as.data.frame(coordinates(states_centers))
并且,绘制它们:
us_map <- fortify(us, region="name")
ggplot() +
geom_map(
data = us_map, map = us_map,
aes(x = long, y = lat, map_id = id),
color = "#2b2b2b", size = 0.1, fill = NA
) +
geom_point(
data = states_centers, aes(x, y), size = 4, color = "steelblue"
) +
coord_equal() + # the points are pre-projected
ggthemes::theme_map()