2016-11-29 3 views
0

Eine ähnliche Frage wurde schon früher gestellt, aber zum Hinzufügen von Daten aus verschiedenen Spalten eines Datenrahmens zum Plot. Link to the questionggplot map: "for" -Schleife fügt nur die letzte Kartenebene hinzu

In meinem Fall möchte ich neue Kartenebenen, wenn sie in der globalen Umgebung existieren, meiner endgültigen Karte mit einer "for" -Schleife hinzufügen.

Mit dem Code, wie es jetzt ist, wird nur die letzte Schicht, die Punkte, auf der Karte eingezeichnet, aber nicht die Leitungsschicht:

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

Da ich nicht verwenden können, melt, um dies zu lösen, wie in der vorherigen Frage vorgeschlagen: Gibt es eine andere Möglichkeit, alle Schichten in der "for" -Schleife zu plotten?

+0

Sie beginnen mit einem "frischen" Diagramm in jeder Iteration der Schleife. Wahrscheinlich möchten Sie den Plot "plot <- myMap" initiieren, kurz bevor Sie die Schleife starten. Es sieht so aus, als ob "gg.data" in jeder 'if' Anweisung auch funktionieren müsste. In der Punkteebene wird diese in einen dat.frame umgewandelt, so dass die Ebene gut funktioniert, aber Sie verwenden "gg.data" direkt in den anderen Ebenen und es scheint kein data.frame zu sein. – aosmith

+0

Vielen Dank, die 'plot <- myMap' zu verschieben, bevor die" for "-Schleife es tatsächlich gelöst hat !! Ich habe nur den Punkte-Layer in einen data.frame umgewandelt, da er mir sonst einen Fehler gab: 'ggplot2 weiß nicht, wie man mit Daten der Klasse SpatialPoints umgeht – Joris

Antwort

1

Sie initiieren derzeit in jeder Iteration der Schleife Ihre Basiszuordnung, die plot ersetzt, die Sie in der vorherigen Iteration erstellt haben. Initiieren Sie die Basiszuordnung, bevor Sie die Schleife starten, um alle Ebenen derselben Karte hinzuzufügen.

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) 
} 
Verwandte Themen