Нанесение нескольких линий на 1 карту

Я хотел бы отобразить 2 разных маршрута на 1 карте. Это код, который я сделал в качестве примера:

### Plot 2 routes on 1 map

# libraries

library(ggmap)
library(ggplot2)

# plot map

basicmap <- get_map(location = c(lon = 3, lat = 50),
                    zoom = 12,
                    maptype = "roadmap",
                    source = "google",
                    color = "color")  #completely random location
basicmap <- ggmap(basicmap)

# determine routes

routes <- data.frame(from = c("Rocquigny", "Nurlu"),
                     to = c("Heudicourt","Longavesnes"),
                     stringsAsFactors = FALSE)

# calculate routes

calculationroute <- function(startingpoint, stoppoint) {
  route(from = startingpoint,
        to = stoppoint,
        mode = "bicycling",
        structure = "route")
}
  #this function calculates the route

calculatedroutes <- mapply(calculationroute,
                           startingpoint = routes$from,
                           stoppoint = routes$to,
                           SIMPLIFY = FALSE)
  #calculate the 2 routes

# draw routes

drawroute <- function(route) {
  geom_path(aes(data = route,
                x = lon,
                y = lat))
}
  #this functions draws the route

extendedmap <- basicmap + lapply(X = calculatedroutes,
                                 FUN = drawroute)
plot(extendedmap)
  #draw the routes

Итак, те шаги, которые я предпринимаю:

  1. Фоновая карта создана
  2. Я делаю кадр данных, который содержит начальные и конечные точки для 2 маршрутов.
  3. С помощью ggmap я вычисляю сегменты этих маршрутов.
  4. Я стараюсь рисовать маршруты поверх фоновой карты.

К сожалению, последний шаг терпит неудачу, и возникает эта ошибка:

Don't know how to automatically pick scale for object of type function. Defaulting to continuous
Error in data.frame(x = c(2.89030838012694, 3.11003494262694, 2.89030838012694,  : 
  arguments imply differing number of rows: 4, 0

Я выполнил поиск и предыдущий вопрос хотел сделать то же самое. Решение, которое он в конце концов выбрал, использует цикл for, и я бы предпочел сохранить согласованность своего кода, используя вместо этого lapply.


person 1053Inator    schedule 09.08.2015    source источник
comment
Цикл for является прекрасным решением для этого, так как он добавляет геометрию очень стандартным способом для построения графика в ggplot. нет ничего плохого в использовании циклов for в R и/или смешивании их с использованием идиомы *apply.   -  person hrbrmstr    schedule 09.08.2015


Ответы (1)


Как я сказал в комментарии, цикл for работает, но вы можете сделать это еще более ggplot-подобным способом. Во-первых, нам нужно изменить ваш вызов ggmap, так как экстенты недостаточно велики для одного из ваших маршрутов:

basicmap <- get_map(location = c(lon = 3, lat = 50),
                    zoom = 8,
                    maptype = "roadmap",
                    source = "google",
                    color = "color")  #completely random location
basicmap <- ggmap(basicmap)

Как только вы рассчитаете маршруты, мы можем сделать из них длинный фрейм данных:

do.call(rbind.data.frame, lapply(names(calculatedroutes), function(x) {
  cbind.data.frame(route=x, calculatedroutes[[x]], stringsAsFactors=FALSE)
})) -> long_routes

а затем используйте эстетику group для geom_path:

basicmap + geom_path(data=long_routes, 
                     aes(x=lon, y=lat, group=route, color=route),
                     size=1)

введите здесь описание изображения

person hrbrmstr    schedule 09.08.2015
comment
Спасибо за ответ, это работает. И мне жаль, что карта недостаточно велика, я адаптировал этот пример из своего исходного кода и пропустил этот ляпсус. - person 1053Inator; 10.08.2015