2

我正在尝试使用 ggmap 在地图上绘制位置。因为我想使用分面,所以我必须将base_layer参数提供给ggmap. 我也试图将它包装在一个函数中。

我有定义地图边界框的变量:

long.range <- c(-71.5, -67.5)
lat.range <- c(42.5, 44.5)

还有一个 data.frame 定义了我要绘制的数据:

test.data <- data.frame("Name" = c("site1","site2","site3"),
                        "LAT" = c(43.25,43.4,44),
                        "LONG" = c(-71.25,-69.5,-68.5))

我有一个函数可以抓取地图并将data.frame应用为base_layer:

CreateBaseMap <- function(lat.range = c(NA,NA),
                          long.range = c(NA,NA),
                          data.in = NULL){    
  # download the map tile
  base.map.in <- get_map(location = c(min(long.range),
                                      min(lat.range),
                                      max(long.range),
                                      max(lat.range)),
                         source = "osm")
  # create the map object
  if (is.null(data.in)){
    base.map <- ggmap(base.map.in)
  } else {    
    base.map <- ggmap(base.map.in,
                      base_layer = ggplot(aes_string(x = "LONG",
                                                     y = "LAT"),
                                          data = data.in))
  }
  base.map <- base.map +
    labs(x = "Longitude",
         y = "Latitude") + 
    coord_map()
  print(base.map)
  return(base.map)
}

然后我使用调用我的函数

base.map <- CreateBaseMap(lat.range = lat.range, long.range = long.range, data.in = test.data)

我得到这个错误。

Error in ggplot(aes_string(x = "LONG", y = "LAT"), data = data.in) : 
  object 'data.in' not found

到目前为止的故障排除

我知道我是否直接调用函数的胆量,如下所示:

base.map <- ggmap(get_map(location = c(min(long.range),
                                       min(lat.range),
                                       max(long.range),
                                       max(lat.range)),
                          source = "osm"),
                  base_layer = ggplot(aes_string(x = "LONG",
                                                 y = "LAT"),
                                      data = test.data)) +
  geom_point()
print(base.map)

然后它工作正常。

我要的图

我还使用print(data.in)data.in 在调用 to 之前检查了它是否存在base_layer,我可以看到它就在那里。

问题

看来调用base_layer无法识别data.in.

  1. 我怎样才能说服base_layer它真的想接受data.in
  2. 这是 的问题ggplot,还是我做错了什么?
4

1 回答 1

0

解决方案似乎是在从调用创建%+%的项目上使用,而不是包含在对. 这绕过了@baptiste 发现的代码问题。ggplotggmapbase_layerggmap

要实施此解决方案,请复制以下代码以代替#create the map object我原来问题中的代码:

# create the map object
  if (is.null(data.in)){
    base.map <- ggmap(base.map.in)
  } else {    
    base.map <- ggmap(base.map.in ) %+% data.in + aes(x = LONG,
                                                      y = LAT)
  }
于 2013-07-04T22:27:50.663 回答