用光栅上的点绘制人工制品

时间:2011-05-12 11:43:14

标签: r raster raster-graphics

我在调整绘图窗口大小时注意到了一些奇怪的行为。考虑

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,则情节会很好。谁能解释一下呢?

2 个答案:

答案 0 :(得分: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中)。

另一种看待问题的方法是显示axis()不知道绘图使用的空间,这与过度绘图时看到的问题相同:

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

调整x轴长度时,两个轴不再同步。

答案 1 :(得分:-1)

因为你有一个光栅,试着用image()替换plot()。我有同样的问题,但这解决了我。