Создание артефакта с точками над растром
Я заметил странное поведение при изменении размера окна графика. Рассматривать
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(). У меня была та же проблема, но это решило ее для меня.