Suite

Insertion d'un tracé agrandi avec un tracé à grande échelle dans le package sp dans R


j'utilise lespemballer dansRpour tracer des points échantillonnés le long d'une rivière. Cependant, je voudrais zoomer sur une zone échantillonnée de toute la rivière et tracer cette zone zoomée sur toute la longueur de la rivière. En utilisant lespplotfonction est utile, car j'ai différentes variables par point. Pour "zoomer", je peux simplement changer leylimetxlimarguments lors de l'utilisation duspplotune fonction.

En utilisant lemeusejeu de données à titre d'exemple

bibliothèque(sp) bibliothèque(treillis) données(meuse) coordonnées(meuse)=~x+y FUll.study<-spplot(meuse) #Donne la zone d'étude complète ZOOM<-spplot(meuse, xlim=c(170000, 181000 ), ylim=c(329714,333611)) #Zone aléatoire pour zoomer.

Les résultats ressemblent à ceci :

Cependant, le résultat souhaité est quelque chose comme ceci :

J'essaie de trouver un moyen d'ajouter leZOOMdans une zone de laEtude.complètemap.Je soupçonne parce quespplotça depend detreillisce n'est peut-être pas possible. Dans ce cas, je devrais créer une carte pour chaque variable indépendamment et ajouter la zone zoomée respective, probablement viapar(nouveau=VRAI), mais ce n'est qu'une idée. Il me faudrait encore trouver comment spécifier l'emplacement et ajuster la taille de la zone zoomée.


Voici une suggestion utilisant ggplot. j'utiliseggplotGrobpour combiner la carte complète et agrandie etgrid.arrangeà partir du module complémentaire gridExtra pour combiner les cartes pour différentes variables. De nombreux ajustements peuvent être effectués, bien sûr.

library(sp) library(ggplot2) library(grid) # pour unit library(gridExtra) # pour grid.arrange # zoom bounding box xlim <- c(179500,181000); ylim <- c(332000,332500) # taille de la zone zoomée - décalage par rapport au coin supérieur gauche du graphique principal : x_offs <- 1000 ; y_offs <- 1300 # paramètres pour l'intrigue complète fulltheme <- theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.text.x=element_blank( ), axis.text.y=element_blank(), axis.ticks=element_blank(), axis.title.x=element_blank(), axis.title.y=element_blank()) # paramètres pour le zoom plot zoomtheme <- theme( legend.position="none", axis.line=element_blank(),axis.text.x=element_blank(), axis.text.y=element_blank(),axis.ticks=element_blank(), axis.title.x= element_blank(),axis.title.y=element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_rect(color='red', fill="white "), plot.margin = unit(c(0,0,-6,-6),"mm")) ############## exemple de point ####### ###### data(meuse) # variables à tracer vars <- names(meuse)[3:10] plotlist <- list() for (i in vars) { # full plot p.full <- ggplot(meuse , aes_string(x = "x", y = "y", color=i)) + geom_point() + fulltheme # zoomed plot p.zoom <- ggplot(meuse, aes_string(x = "x", y = "y", color=i)) + geom_point() + coord_cartesian(xlim=xlim, ylim=ylim) + zoomtheme # les assembler g <- ggplotGrob(p.zoom) plotlist [[length(plotlist) + 1]] <- p.full + annotation_custom(grob = g, xmin = min(meuse$x), xmax = min(meuse$x) + x_offs, ymin = max(meuse$y) - y_offs, ymax = max(meuse$y)) } # tracer do.call(grid.arrange, c(plotlist, ncol=4))

De même, ggplot peut gérer les rasters.

############################################ ###### ######## exemple raster ############# bibliothèque(raster) r <- raster(system.file("external/test.grd", package="raster") ) s <- stack(r, r*2, log(r)) name(s) <- c('meuse', 'meuse2', 'meuseLog') meuseRast <- data.frame(rasterToPoints(s)) rastvars <- names(meuseRast)[-c(1:2)] plotrast <- list() for (i in rastvars) { p.fullrast <- ggplot(meuseRast, aes_string(x = "x", y = "y" , fill = i)) + geom_raster() + fulltheme p.zoomrast <- ggplot(meuseRast, aes_string(x = "x", y = "y", fill = i)) + geom_raster() + coord_cartesian(xlim=xlim , ylim=ylim) + zoomtheme g <- ggplotGrob(p.zoomrast) plotrast[[length(plotrast) + 1]] <- p.fullrast + annotation_custom(grob = g, xmin = min(meuseRast$x), xmax = min(meuseRast$x) + x_offs, ymin = max(meuseRast$y) - y_offs, ymax = max(meuseRast$y)) } # plot do.call(grid.arrange, c(plotrast, nrow=1))


Vous pouvez utiliser lemaptools::elidefonction pour traduire les coordonnées d'unSpatial*objet. Si vous combinez le résultat avec lemise en page sp.argument despplotou avec letreillisExtra::couchefonction, vous obtiendrez ce dont vous avez besoin :

bibliothèque(sp) bibliothèque(maptools) bibliothèque(raster) bibliothèque(treillis) bibliothèque(latticeExtra) données(meuse) coordonnées(meuse)=~x+y ZOOM <- crop(meuse, étendue(180000, 181000, 330000, 331500) ) déplacé <- elide(ZOOM, shift = c(-1200, 2000)) spplot(meuse["zinc"], scales = list(draw = TRUE)) + layer({ sp.points(ZOOM, col = 'black ') sp.points(déplacé, col =") })