在R中使用ggplot向usmap添加点

7

我能够通过这个教程创建一个美国地图。但是,当我尝试添加额外的点时,无论我输入什么数据,它们都最终出现在南达科他州。

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个回答

7

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 = x, y = y), 
             color = "red",
             size = 3)

显示位于南达科他州苏福尔斯的美国地图上的单个红点的图表

还有一个名为高级制图的新小册子,可以更详细地展示这一点。


3

这是一个“有趣”的软件包,与底层生成形状文件的博客文章代码相比,没有太多的增值(但软件包作者没有在软件包DESCRIPTION中列出博客文章的作者,只是在README的末尾添加了一条信息)。

作者没有考虑提供除区域图之外的其他支持。您的问题是地图在一个坐标系中,而您的点在另一个坐标系中。

如果您可以使用非CRAN软件包,则albersusa(在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() 函数来修改任何阿拉斯加或夏威夷的点。长期以来,一个待处理的问题是使 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))

并将它们绘制出来:

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

enter image description here


1
我是usmap的维护者。在DESCRIPTION中,有没有推荐的方式来给你的博客文章署名?在创建这个软件包时,我并不知道如何做到这一点,但我非常乐意将其放在适当的位置上。 - Paolo
2
@Paolo 我也想指出usmap有一个增值功能。它不依赖于非R库,如geosgdal,如果您没有管理员访问权限,则可能会出现问题。所以感谢您的软件包。是否有一种方法可以使用您的软件包将州和县边界投影为对比色? - Cyrus Mohammadian
我在这里发布了一个问题:https://dev59.com/Rbjoa4cB1Zd3GeqPEskX - Cyrus Mohammadian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接