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