Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用带有geom_点的for循环向现有ggplot对象添加点_R_Ggplot2 - Fatal编程技术网

使用带有geom_点的for循环向现有ggplot对象添加点

使用带有geom_点的for循环向现有ggplot对象添加点,r,ggplot2,R,Ggplot2,我对R很陌生,我正在尝试创建一张我的国家地图,上面覆盖着代表城市的点,点的大小取决于人口。我已经使用lat和长边界创建了geom_sf地图,并将其存储为地图 这是我试图复制的代码的一个示例,其中cities是一个df,包含state、pop、lat和long列,没有缺失值: map <- map + geom_point(aes(x = cities$long[1], y = cities$lat[1], size = cities$pop[1])) + geom_point(ae

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

这是我试图复制的代码的一个示例,其中cities是一个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_点,因为我的地图只以最后一个点结束。每次迭代输出一个贴图时,它只显示最近的点

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对象如下所示:

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

crs=4326选项用于确保数据投影在WGS84中,WGS84是lat/long坐标的标准。如果使用不同的投影对底图进行投影,则可能需要使用sf::st_transform…

调整底图以匹配lat/long数据…

是否有可能?作为一个新的R用户,这两个概念可能会有所帮助:1对于ggplot,您在data参数中提供数据帧,并且只提供列名,即long,而不是aes中的cities$long。2R是矢量化的。通常不需要for循环。相反,您可以提供整个值向量,例如long、lat和pop是值向量,而函数geom_point在本例中通过对函数的一次调用对所有值进行操作。关于为什么使用for循环只得到最后一个点,请参阅。@eipi10谢谢!我知道我错在哪里了,并欣赏与懒惰评估解释的联系。我当然没有意识到这一点。第三章的介绍让我笑了:这是一个带C口音的R,一个很重的口音。我觉得自己暴露了。另外,很高兴知道下一次的最小可重复性示例。再次感谢。
cities_spatial <- cities %>% 
  st_as_sf(coords = c("lat","long"), crs = 4326)

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