tracer des artefacts avec des points sur raster
-
12-11-2019 - |
Question
J'ai remarqué un comportement étrange lors du redimensionnement de la fenêtre de l'intrigue. Envisager
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 = "+")
Si vous redimensionnez la fenêtre, les points tracés obtiennent une étendue différente par rapport au raster sous-jacent. Si vous redimensionnez la fenêtre et tracez shrunk
et shrunk.coords
Encore une fois, l'intrigue s'avère bien. Quelqu'un peut-il expliquer cela?
La solution
Si vous tracez directement avec le RasterLayer
Méthode pour tracer Le problème de redimensionnement ne se produit pas.
## gives an error, but still plots
raster:::.imageplot(shrunk)
points(shrunk.coords, pch = ".")
Il doit donc être quelque chose dans l'appel d'intrigue d'origine avant le .imageplot
la méthode est appelée.
showMethods("plot", classes = "RasterLayer", includeDefs = TRUE)
Cela se produit si nous appelons raster:::.plotraster
directement, et c'est la fonction qui appelle raster:::.imageplot
:
raster:::.plotraster(shrunk, col = rev(terrain.colors(255)), maxpixels = 5e+05)
points(shrunk.coords, pch = ".")
Il est en fait dans les étiquettes de l'axe, pas l'image elle-même. Voyez avec cela, ces complots fidèlement sur redimensionner:
raster:::.imageplot(shrunk)
abline(h = c(-80, 80), v = c(-80, 80))
Mais faites-le comme ça, et les lignes ne sont plus à [-80, 80] après le redimensionnement:
plot(shrunk)
abline(h = c(-80, 80), v = c(-80, 80))
C'est donc en fait les points tracés après le raster qui montrent mal: la méthode du tracé maintient le rapport d'aspect fixe, donc l'élargissement de l'intrigue ne "étire" pas le cercle raster vers une ellipse. Mais, il fait quelque chose aux points qui sont ajoutés par la suite, donc les appels à par()
ne doit pas être géré correctement (probablement dans raster:::.imageplot
).
Une autre façon de voir le problème est de montrer qu'Axis () ne connaît pas l'espace utilisé par l'intrigue, qui est le même problème que vous voyez lors de la surplomb:
plot(shrunk)
axis(1, pos = 1)
Lorsque vous redimensionnez la longueur de l'axe X, les deux axes ne sont plus synchronisés.
Autres conseils
Parce que vous avez un raster, essayez de remplacer l'intrigue () par image (). J'ai eu le même problème mais cela l'a résolu pour moi.