Tracciando il manufatto con punti sul raster
-
12-11-2019 - |
Domanda
Ho notato un comportamento strano quando si ridimensionava la finestra della trama. Ritenere
library(sp)
library(rgeos)
library(raster)
rst.test <- raster(nrows=300, ncols=300, xmn=-150, xmx=150, ymn=-150, ymx=150, crs="NA")
sap.krog300 <- SpatialPoints(coordinates(matrix(c(0,0), ncol = 2)))
sap.krog300 <- gBuffer(spgeom = sap.krog300, width = 100, quadsegs = 20)
shrunk <- gBuffer(spgeom = sap.krog300, width = -30)
shrunk <- rasterize(x = shrunk, y = rst.test)
shrunk.coords <- xyFromCell(object = rst.test, cell = which(shrunk[] == 1))
plot(shrunk)
points(shrunk.coords, pch = "+")
Se si ridimensiona la finestra, i punti tracciati ottengono diverse estensioni rispetto al raster sottostante. Se ridimensiona la finestra e tracciano shrunk
e shrunk.coords
Ancora una volta, la trama va bene. Qualcuno può spiegarlo?
Soluzione
Se pianifichi direttamente con il RasterLayer
Metodo per tracciare il problema di ridimensionamento non si verifica.
## gives an error, but still plots
raster:::.imageplot(shrunk)
points(shrunk.coords, pch = ".")
Quindi deve essere qualcosa nella trama originale prima del .imageplot
il metodo è chiamato.
showMethods("plot", classes = "RasterLayer", includeDefs = TRUE)
Si verifica se chiamiamo raster:::.plotraster
direttamente, e questa è la funzione che chiama raster:::.imageplot
:
raster:::.plotraster(shrunk, col = rev(terrain.colors(255)), maxpixels = 5e+05)
points(shrunk.coords, pch = ".")
In realtà è nelle etichette dell'asse, non nell'immagine stessa. Vedi con questo, questo trama fedelmente sul ridimensionamento:
raster:::.imageplot(shrunk)
abline(h = c(-80, 80), v = c(-80, 80))
Ma fallo in questo modo, e le linee non sono più a [-80, 80] dopo il ridimensionamento:
plot(shrunk)
abline(h = c(-80, 80), v = c(-80, 80))
Quindi in realtà sono i punti tracciati dopo il raster che mostrano in modo errato: il metodo della trama mantiene fissa le proporzioni, quindi allargare la trama non "allunga" il cerchio raster in un'ellisse. Ma fa qualcosa ai punti che vengono aggiunti in seguito, quindi le chiamate a par()
non deve essere gestito correttamente (probabilmente in raster:::.imageplot
).
Un altro modo di vedere il problema è mostrare che Axis () non conosce lo spazio utilizzato dalla trama, che è lo stesso problema che vedi durante il piolo in eccesso:
plot(shrunk)
axis(1, pos = 1)
Quando si ridimensiona la lunghezza dell'asse X, i due assi non sono più sincronizzati.
Altri suggerimenti
Poiché hai un raster, prova a sostituire la trama () con immagine (). Ho avuto lo stesso problema, ma questo lo ha risolto per me.