2011-05-12 87 views
6

当调整绘图窗口大小时,我注意到了一些奇怪的行为。考虑将点与点栅格进行绘图

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 = "+") 

如果调整窗口大小,绘制的点与底层栅格相比会有不同的程度。如果您重新调整窗口大小并再次绘制shrunkshrunk.coords,则情节变得良好。任何人都可以解释吗?

回答

4

如果直接使用RasterLayer方法绘图,绘图调整大小问题不会发生。

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

所以它必须有一些在原剧情的呼叫被称为.imageplot方法之前。

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

如果我们直接调用raster:::.plotraster它确实发生了,这是调用raster:::.imageplot功能:

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

它实际上是在轴标签,而不是图像本身。看到这个,这个情节忠实于调整大小:

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

但像这样做,和线调整大小后处于[-80,80]不再:

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

所以它实际上是在光栅显示不正确之后绘制的点:绘图方法保持纵横比固定,因此拓宽绘图不会将光栅圆圈“拉伸”为椭圆。但是,它对之后添加的点做了一些处理,所以par()的调用一定不能正确处理(可能在raster:::.imageplot)。

看到这个问题的另一种方式是表明轴()不知道的空间正在使用的情节,这是你看到overplotting当同样的问题:

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

当调整X轴的长度不再同步。

-1

因为您有栅格,请尝试用图像()替换plot()。我有同样的问题,但这为我解决了。