Создание артефакта с точками над растром

Я заметил странное поведение при изменении размера окна графика. Рассматривать

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

Если вы измените размер окна, точки на графике получат различный экстент по сравнению с базовым растром. Если вы измените размер окна и сюжета shrunk а также shrunk.coords опять сюжет получается нормально. Кто-нибудь может объяснить это?

2 ответа

Решение

Если вы строите график непосредственно с 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))

Таким образом, на самом деле это точки, отображаемые после растра, которые отображаются некорректно: метод plot сохраняет фиксированное соотношение сторон, поэтому расширение графика не "растягивает" растровый круг до эллипса. Но он что-то делает с точками, которые добавляются впоследствии, поэтому par() не должны быть обработаны правильно (вероятно, в raster:::.imageplot).

Другой способ увидеть проблему состоит в том, чтобы показать, что axis() не знает пространства, используемого графиком, что является той же проблемой, которую вы видите при перепечатывании:

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

При изменении длины оси X две оси больше не синхронизируются.

Поскольку у вас есть растр, попробуйте заменить plot() на image(). У меня была та же проблема, но это решило ее для меня.

Другие вопросы по тегам