使用带有geom_point的for循环将点添加到现有ggplot对象中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用带有geom_point的for循环将点添加到现有ggplot对象中相关的知识,希望对你有一定的参考价值。

我对R很陌生,正在尝试创建一个国家/地区的地图,上面叠加了点(代表城市,点按人口大小划分)。我已经使用经纬度较长的纬度使用geom_sf()创建了地图,并将其存储为地图。

这是我要复制的代码示例,其中city是带有状态,pop,lat和long列(无缺失值)的df:

map <- map +
  geom_point(aes(x = cities$long[1], y = cities$lat[1], size = cities$pop[1])) +
  geom_point(aes(x = cities$long[2], y = cities$lat[2], size = cities$pop[2])) +
  geom_point(aes(x = cities$long[3], y = cities$lat[3], size = cities$pop[3])) +
  geom_point(aes(x = cities$long[4], y = cities$lat[4], size = cities$pop[4])) +
  geom_point(aes(x = cities$long[5], y = cities$lat[5], size = cities$pop[5]))

这是我认为可以使用的循环,但似乎每次迭代都会覆盖geom_point,因为我的地图最终以最后一个点结束。当我输出每次迭代的地图时,它仅显示最近的点。

or(i in 1:nrow(cities)){
  if(!is.na(cities$lat[i]) && !is.na(cities$long[i])){
    map <- map +
      geom_point(aes(x = cities$long[i], y = cities$lat[i], size = cities$pop[i]))
  }
}

我希望我提供了足够的信息-如果我没有提供的话,请告诉我。谢谢!

答案

无需循环执行此操作。

没有数据就无法复制,但要假设您的城市对象看起来像:

cities <- data.frame(name = .., 
                     pop = .., 
                     lat = ..., 
                     long = ...)

并且鉴于您的基本映射是geom_sf对象,这就是您需要的所有代码。

cities_spatial <- cities %>% 
  st_as_sf(coords = c("lat","long"), crs = 4326)

map <- map +
  geom_sf(data = cities_spatial, aes(size = pop))

选项crs = 4326是为了确保您的数据以WGS84投影,这是经纬度坐标的标准。如果您的底图map的投影方式不同,则可能需要使用sf::st_transform(...)

对其进行调整以匹配经纬度数据

以上是关于使用带有geom_point的for循环将点添加到现有ggplot对象中的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种快速的方法将点投影到某个网格上?

在python中添加带有for循环的新excel表

NSMutableArray 在 for 循环后不保存添加的项目

我可以在 for 循环中将键值对添加到 NSarray 或字典吗?

你如何使geom_points透明化

使用 ggmap、geom_point 和循环映射 long-lat 数据集的最近邻居