Аналогичный вопрос задан раньше, но для добавления данных из разных столбцов одного кадра данных в график. 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()
Поскольку я не могу использовать melt
, чтобы решить это, как было предложено в предыдущем вопросе: есть ли другой способ построения всех слоев в цикле «for»?
Вы начинаете с «свежего» «сюжета» на каждой итерации цикла. Вероятно, вы захотите инициировать сюжет «plot <- myMap», как раз перед тем, как начать цикл. Похоже, что «gg.data» в каждом выражении 'if' также понадобится. В слое точек вы превращаете это в data.frame, чтобы слой работал нормально, но вы используете «gg.data» непосредственно в других слоях, и он не выглядит как data.frame. – aosmith
Спасибо вам большое, переместив 'plot <- myMap', прежде чем цикл« for »на самом деле решил его! Я превратил только слой точек в файл data.frame, так как он в противном случае дал мне ошибку: 'ggplot2 не знает, как обращаться с данными класса SpatialPoints' – Joris