使用 ggplot2/ggmap 在 R 中的地图上绘制线条

Plotting lines over maps in R with ggplot2/ggmap

我正在尝试在 R 中创建一个地图,该地图在 Google 的地图图像上覆盖人工地理边界(由一组具有纬度和经度值的 (x, y) 点确定) ggmap 的一个区域。我使用的代码如下。

ggmap(mapgilbert) +
  geom_point(data = df, aes(x = lon, y = lat, fill = "red", alpha = 0.8), size = 1, shape = 21) +
  guides(fill=FALSE, alpha=FALSE, size=FALSE) +
  for (i in 1:3){
      geom_segment(data = coords, aes(x = lon[[i]], y = lat[[i]], xend = lon[[(i+1)]], yend = lat[[(i+1)]], alpha = 0.8))
  }

请注意,coords 是一个包含相关纬度和经度值的 data.frame,而 df 是一个包含点值的类似 data.frame;它们的结构都正确。

上面的代码只需要一次迭代就可以正常工作;出现区域图,出现我想绘制的三个点,并且出现在其中两个点之间绘制的线。但是,当我尝试在 for 循环中迭代执行此操作时,会打印 none 行。我在类似的 post 上读到,这是因为 R 的自动打印功能在循环中不起作用,所以我尝试将相关语句包装在 print() 函数中,但只是 returns "NULL" 出于某种原因。我有一种感觉,我正在犯一些明显的错误,但我不确定它是什么。提前致谢!

由于没有可重现的数据,我创建了一个随机数据。请提供您下次的数据。这是所有 SO 用户寻求帮助时必不可少的东西。

您需要为 geom_segment 创建一个数据框。您根本不必遍历数据。 mydf的每一行是一行。您分别使用 xyxendyend.

为经度和纬度指定两个点
library(ggmap)
library(ggplot2)

# Create a data frame for segments.
mydf <- data.frame(id = 1:3, 
                   lat_1 = c(37.78, 37.75, 37.73), 
                   lon_1 = c(-122.41, -122.40, -122.405), 
                   lat_2 = c(37.77, 37.75, 37.72), 
                   lon_2 = c(-122.43, -122.42, -122.415))

# Create randam data points.
set.seed(111)

mydf2 <- data.frame(lon = runif(n = 100, min = -122.49, max = -122.38),
                    lat = runif(n = 100, min = 37.69, max = 37.813))

# Get a map 
map <- get_map(location = c(left = -122.523, bottom = 37.69,
                            right = -122.35, top = 37.8),
               maptype = "roadmap", source = "google", color = "bw")

# Plot the points and draw the segments on the map. 
ggmap(map) + 
geom_point(data = mydf2, 
           aes(x = lon, y = lat), color = "red", alpha = 0.6, size = 2) + 
geom_segment(data = mydf, 
             aes(x = lon_1, y = lat_1, xend = lon_2, yend = lat_2), 
             color = "green", size = 2, alpha = 0.8, lineend = "round")
#> Warning: Removed 34 rows containing missing values (geom_point).

reprex package (v0.2.0) 创建于 2018-03-25。