如何在一个单位正方形上多次进行 100 个点的 Voronoi 镶嵌

How to do Voronoi tessellation of 100 points on a unit square multiple times

简而言之,我将对 100 个点进行 Voronoi 镶嵌,并创建不同的 100 个点集 1000 次,并对每组点进行镶嵌。

我创建的点为,

x=matrix(runif(100*1000),nrow=100,ncol=1000)
y=matrix(runif(100*1000),nrow=100,ncol=1000)

使用 spatstat 包执行 Voronoi 曲面细分的基本代码是

dir = ppp(x=x, y=y, window = square(c(0,1)))
tess = dirichlet(dir)
plot(tess, main = "")
points(dir, pch=19, cex = 0.5)

但是,我需要对 1000 个样本进行 Voronoi 曲面细分并尝试创建一个循环。我想选择 x 和 y 的每一列,最后得到 1000 'dir'。然后对 1000 'dir' 进行曲面细分 'tess'。我还需要使用函数 area=tile.areas(tess)

计算 voronoi 单元的面积

我创建的循环是

for (i in 1000) {
  dir[i] = ppp(x=x[,i], y=y[,i], window = square(c(0,1)))
}

但我得到的只是错误和警告。你知道怎么做吗?

您需要将输出存储在一个对象中,在这种情况下,我们将其放在一个名为 dirList 的列表中。此外,您必须指定要迭代的序列。 for (i in 100) 什么都不做,必须是 for (i in 1:100)

library(deldir)
library(spatstat)

x <- matrix(runif(100 * 1000), nrow = 100, ncol = 1000)
y <- matrix(runif(100 * 1000), nrow = 100, ncol = 1000)

dirList <- list()

for (i in 1:1000){
  dirList[[i]] <- ppp(x = x[ , i], y = y[ , i], window = square(c(0, 1)))
}

然后要绘图,您可以使用 [[]]

访问对象
tess = dirichlet(dirList[[1]])
plot(tess, main = "")

关于你问题的第二部分,使用你的对象 tess 作为一组点:

Credit to @DJack for the general process

library(deldir)
library(spatstat)
library(maptools)
library(rgeos)

x <- matrix(runif(100 * 1000), nrow = 100, ncol = 1000)
y <- matrix(runif(100 * 1000), nrow = 100, ncol = 1000)

x <- x[ , 1]
y <- y[ , 1]

dir = ppp(x=x, y=y, window = square(c(0,1)))
tess = dirichlet(dir)

t1 <- as(tess, "SpatialPolygons")
t2 <- unionSpatialPolygons(t1, ID=rep(1,length(t1)))
vor_border <- which(gRelate(t1,t2, byid=TRUE) %in% c("2FF11F212"))

par(mfcol=c(1,3))
plot(t1)
plot(t1[vor_border,], col="red")
# you could also invert the mask to get just the inner polygons
plot(t1[-vor_border,], col="lightblue")