在 r 中使用 ggplot 向 usmap 添加点

Posted

技术标签:

【中文标题】在 r 中使用 ggplot 向 usmap 添加点【英文标题】:Add points to usmap with ggplot in r 【发布时间】:2018-10-21 03:15:28 【问题描述】:

我可以用这个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")

【问题讨论】:

【参考方案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 = x, y = y), 
             color = "red",
             size = 3)

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

【讨论】:

【参考方案2】:

这是一个“有趣”的包,它对生成基础 shapefile 的博客文章代码没有太多附加值(但包作者认为不适合将包中的博客文章的作者归功于 @ 987654324@,只是对 README 结尾的补充)。

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

如果您可以使用非 CRAN 包,albersusa(在 usamap 作者制作 copypasta 包之前 有一段时间)提供了必要的粘合剂:

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

【讨论】:

我是usmap的维护者。有没有推荐的方法来将您的博客文章归功于DESCRIPTION?我在创建包时不知道如何做到这一点,但我很乐意将它包含在适当的位置。 @Paolo Id 还想指出usmap 确实具有增值功能。它不依赖于非 R 库,例如 geosgdal,如果您没有对环境的管理员访问权限,这可能会出现问题。所以谢谢你的包裹。有没有办法在你的包中使用对比色来预测州和县的边界? ***.com/questions/59851823/…我在这里发帖...

以上是关于在 r 中使用 ggplot 向 usmap 添加点的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化使用geom_ribbon()函数向ggplot2图添加置信度带(Confidence BandConfidence Interval)

在 ggplot2 中向线型图例添加附加线

在 ggplot2 中使用计数数据向直方图添加密度线

在 R 中使用 ggplot2 向饼图图例添加值

如何在不改变绘图宽度的情况下使用 ggplot2 在 R 中添加可变大小的 y 轴标签?

R语言可视化——ggplot2画回归曲线