2016-11-29 8 views
0

Аналогичный вопрос задан раньше, но для добавления данных из разных столбцов одного кадра данных в график. Link to the questionggplot map: цикл «for» добавляет только окончательный слой карты

В моем случае я хотел бы добавить новые слои карты, если они существуют в глобальной среде, к моей окончательной карте с циклом «для».

С кодом, как сейчас, только последний слой, точки, строится на карте, но не слой линии:

rm(list = ls()) 
library(OpenStreetMap) 
library(ggplot2) 
library(sp) 

### The base layer map 
map <- OpenStreetMap::openmap(c(55.8759, -4.2946), c(55.8638, -4.2776), type="osm") 
map <- openproj(map) 
myMap <- ggplot2::autoplot(map) 

### Create some custom map files 
# Some spatial point 
new_shapefile <- data.frame(long = -4.290, lat = c(55.868, 55.872)) 
sp::coordinates(new_shapefile) <- c("long", "lat") 
sp::proj4string(new_shapefile) <- sp::CRS("+init=epsg:4326") 

# Some spatial line 
x <- c(-4.290,-4.285) 
y <- c(55.868,55.868) 
new_line <- SpatialLines(list(Lines(Line(cbind(x,y)), ID="a"))) 
new_line = SpatialLinesDataFrame(new_line, data.frame(Z = c("Road"), row.names = c("a"))) 


addLayer <- function(){ 
    glob <- globalenv() 
    customFiles <- data.frame(ls(pattern = "^(?i)new", envir = glob)) 
    colnames(customFiles) <- "X" 
    customFiles$X <- as.character(customFiles$X) 
    for(i in 1:length(customFiles$X)){ 
    plot <- myMap 
    gg.data <- get(paste(customFiles$X[i])) 
    if(grepl("^SpatialPolygons", class(get(paste(customFiles$X[i])))) == TRUE){ 
     plot <- plot + geom_polygon(data = gg.data, aes(long, lat, group= group)) 
    } 
    if(grepl("^SpatialLines", class(get(paste(customFiles$X[i])))) == TRUE){ 
     plot <- plot + geom_path(data = gg.data, aes(long, lat, group= group)) 
    } 
    if(grepl("^SpatialPoints", class(get(paste(customFiles$X[i])))) == TRUE){ 
     plot <- plot + geom_point(data = data.frame(coordinates(gg.data)), aes(long, lat)) 
    } 
    } 
    print(plot) 
} 


### Run the function 
addLayer() 

enter image description here

Поскольку я не могу использовать melt, чтобы решить это, как было предложено в предыдущем вопросе: есть ли другой способ построения всех слоев в цикле «for»?

+0

Вы начинаете с «свежего» «сюжета» на каждой итерации цикла. Вероятно, вы захотите инициировать сюжет «plot <- myMap», как раз перед тем, как начать цикл. Похоже, что «gg.data» в каждом выражении 'if' также понадобится. В слое точек вы превращаете это в data.frame, чтобы слой работал нормально, но вы используете «gg.data» непосредственно в других слоях, и он не выглядит как data.frame. – aosmith

+0

Спасибо вам большое, переместив 'plot <- myMap', прежде чем цикл« for »на самом деле решил его! Я превратил только слой точек в файл data.frame, так как он в противном случае дал мне ошибку: 'ggplot2 не знает, как обращаться с данными класса SpatialPoints' – Joris

ответ

1

В настоящее время вы начинаете свою базовую карту в начале каждой итерации цикла, который заменяет plot, который вы сделали на предыдущей итерации. Начните базовую карту перед запуском цикла, чтобы добавить все слои к одной карте.

addLayer <- function(){ 
    glob <- globalenv() 
    customFiles <- data.frame(ls(pattern = "^(?i)new", envir = glob)) 
    colnames(customFiles) <- "X" 
    customFiles$X <- as.character(customFiles$X) 
    plot <- myMap 
    for(i in 1:length(customFiles$X)){ 
    gg.data <- get(paste(customFiles$X[i])) 
    if(grepl("^SpatialPolygons", class(get(paste(customFiles$X[i])))) == TRUE){ 
     plot <- plot + geom_polygon(data = gg.data, aes(long, lat, group= group)) 
    } 
    if(grepl("^SpatialLines", class(get(paste(customFiles$X[i])))) == TRUE){ 
     plot <- plot + geom_path(data = gg.data, aes(long, lat, group= group)) 
    } 
    if(grepl("^SpatialPoints", class(get(paste(customFiles$X[i])))) == TRUE){ 
     plot <- plot + geom_point(data = data.frame(coordinates(gg.data)), aes(long, lat)) 
    } 
    } 
    print(plot) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^