在r中使用ggplot将点添加到usmap

时间:2018-10-21 03:15:28

标签: r ggplot2 usmap

我能够使用此tutorial创建美国地图。当我尝试添加其他点时,无论我输入什么数据,它们都最终到达了南达科他州。

library(ggplot2)
library(usmap)
testData <- data.frame(LATITUDE = 20.31557, LONGITUDE = -102.42547)
p <- plot_usmap( regions = "state") 
p + geom_point(data = testData, aes(x = LONGITUDE, y = LATITUDE), color = "red")

2 个答案:

答案 0 :(得分:1)

这是一个“有趣的”程序包,相对于生成基础shapefile的博客帖子代码没有太多增值(但是,该程序包作者认为不适合在该程序包中写博客帖子的作者{ {1}},仅是自述文件末尾的附加内容。

作者也认为不适合做的一件事是为除弦乐之外的任何事物提供支持。您的问题是地图在一个坐标系中,而点在另一个坐标系中。

如果您可以使用非CRAN软件包,DESCRIPTION(在albersusa作者制作copypasta软件包之前大约 )提供了必要的胶水: / p>

usamap

预先投影美国地图:

library(albersusa) # https://gitlab.com/hrbrmstr/albersusa / https://github.com/hrbrmstr/albersusa
library(ggplot2)
library(sp)

我们将使用内置的“ state.center”数据来获得一些要点

us <- usa_composite(proj = "aeqd")

但是,如果您在state.center上查找帮助,您会发现它们没有为阿拉斯加和夏威夷提供合法的坐标,我们不能使用它们:

states_centers <- as.data.frame(state.center)
states_centers$name <- state.name

注意:如果您在阿拉斯加/夏威夷确实有点,则需要使用包中的'points_elided()函数来修改任何阿拉斯加或夏威夷点。长期以来,TODO一直在使states_centers <- states_centers[!(states_centers$name %in% c("Alaska", "Hawaii")),] 支持所有转换,但是我几乎不需要在choropleths之外使用该程序包,因此它在一段时间内将成为TODO。

现在,通过从长经/纬线到投影坐标系,使它们成为我们地图的合法坐标:

points_elided()

然后绘制它们:

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

enter image description here

答案 1 :(得分:1)

usmap 0.5.0 起,存在一个名为usmap_transform的新函数,该函数转换data.frame以匹配usmap使用的投影。

以下是与您提供的数据类似的示例:

library(usmap)
library(ggplot2)

# Lat/Lon of Sioux Falls, SD
test_data <- data.frame(lon = -96.70, lat = 43.55)

transformed_data <- usmap_transform(test_data)

plot_usmap("states") + 
  geom_point(data = transformed_data, 
             aes(x = lon.1, y = lat.1), 
             color = "red",
             size = 3)

Plot showing a single red point on a US map, where Sioux Falls, SD is located

还有一个名为Advanced Mapping的新小插图,详细显示了这一点。