【问题标题】:Using a for loop with geom_point to add points to a existing ggplot object使用带有 geom_point 的 for 循环将点添加到现有的 ggplot 对象
【发布时间】:2020-05-30 14:45:36
【问题描述】:

我对 R 很陌生,正在尝试创建一张我的国家地图,上面覆盖着点(代表城市,点按人口大小)。我已经使用 lat、long 边界使用 geom_sf() 创建了地图,并将其存储为地图。

这是我尝试复制的代码示例,其中城市是一个 df,其中包含 state、pop、lat 和 long 列(没有缺失值):

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

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

【问题讨论】:

  • minimal reproducible example 的任何机会...?
  • 作为一个新的R用户,也许这两个概念会有所帮助:(1)使用ggplot,您在data参数中提供数据框,并且只提供列名(即@ 987654327@ 而不是cities$long) 在aes 内。 (2) R 是“矢量化的”。您通常不需要 for 循环(请参阅 chapter 3)。相反,您提供整个值向量(例如,longlatpop 是值向量),在这种情况下,函数 geom_point 只需一次调用即可对所有值进行操作函数。
  • 关于为什么只用 for 循环获得最后一点,请参阅 here
  • @eipi10 谢谢!我看到了哪里出错了,并感谢链接与惰性评估的解释。当然不是我所知道的。第 3 章的介绍让我笑了:“这是说带有 C 口音的 R —— 口音很重。”我觉得暴露了。此外,很高兴了解下一次的最小可重现示例。再次感谢。

标签: r ggplot2


【解决方案1】:

无需循环执行此操作。

如果没有您的数据就无法重现,但假设您的城市对象如下所示:

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

【讨论】:

    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多