2011-05-12 6 views
6

Noté un comportamiento extraño al cambiar el tamaño de la ventana de trazado. Considereartefacto de trazado con puntos sobre la trama

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 cambia el tamaño de la ventana, los puntos trazados obtienen una extensión diferente en comparación con el ráster subyacente. Si cambia el tamaño de la ventana y traza shrunk y shrunk.coords nuevamente, la trama sale bien. ¿Alguien puede explicar esto?

Respuesta

4

Si grafica directamente con el método RasterLayer para el diagrama, no ocurre el problema de cambio de tamaño.

## gives an error, but still plots 
raster:::.imageplot(shrunk) 
points(shrunk.coords, pch = ".") 

Por lo tanto, debe ser algo en la llamada trama original antes de llamar al método .imageplot.

showMethods("plot", classes = "RasterLayer", includeDefs = TRUE) 

Es ocurre si llamamos raster:::.plotraster directamente, y esta es la función que llama a raster:::.imageplot:

raster:::.plotraster(shrunk, col = rev(terrain.colors(255)), maxpixels = 5e+05) 
points(shrunk.coords, pch = ".") 

En realidad, es en las etiquetas de los ejes, no la imagen misma. Ver con esto, esta parcelas fielmente el cambio de tamaño:

raster:::.imageplot(shrunk) 
abline(h = c(-80, 80), v = c(-80, 80)) 

Pero hacerlo de esta manera, y las líneas ya no están en [-80, 80] son ​​después de redimensionamiento:

plot(shrunk) 
abline(h = c(-80, 80), v = c(-80, 80)) 

Por lo tanto, es en realidad los puntos trazados después del ráster que se muestran incorrectamente: el método de trazado mantiene fija la relación de aspecto, por lo que al ampliar el trazado no se "estira" el círculo ráster a una elipse. Pero hace algo con los puntos que se agregan después, por lo que las llamadas al par() no se deben manejar correctamente (probablemente en raster:::.imageplot).

Otra forma de ver el problema es demostrar que el eje() no conoce el espacio que está siendo utilizado por la trama, que es el mismo problema que se ve cuando overplotting:

plot(shrunk) 
axis(1, pos = 1) 

Al cambiar el tamaño de la x longitud del eje, los dos ejes ya no están sincronizados.

-1

Como tiene un ráster, intente reemplazar plot() con image(). Tuve el mismo problema, pero esto lo resolvió para mí.

Cuestiones relacionadas