- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在分析某些粒子的生长模式,并想将点模式与强度相同(每单位面积的点数相同)的完美六角晶格的点模式进行比较。我已经编写了一个执行此操作的函数,但它有一个固有错误,我不确定它的来源。本质上,在函数运行完之后,它会生成一个完美的六边形点图案,但没有正确数量的粒子——通常会偏离大约 1-4%。如果将以下代码复制并粘贴到 R 中,您将看到这一点 - 对于这个特定示例,错误为 11.25% - 原始点图案有 71 个粒子,生成的完美六边形点图案有 80 个粒子。这看起来很奇怪,因为正如您将看到的,代码旨在将粒子彼此放置特定距离,从而创建一个与原始窗口大小相同且粒子数量相同的窗口。
下面是我写的生成六角点阵的函数代码。
library(spatstat)
data(swedishpines)
swedishpines.df <- as.data.frame(swedishpines)
MaxXValue <- max(swedishpines.df[1])
MaxYValue <- max(swedishpines.df[2])
#The above two lines dictate the window size
NumberOfParticles <- nrow(swedishpines.df[1])
#Number of entries = number of particles
#calculate delta
intensity <- NumberOfParticles / (MaxXValue*MaxYValue)
#Intensity ---> particles / unit^2
#Area = ( sqrt(3) / 2 ) * delta^2
#Now - in substituting intensity in for area, it is key to recognize
#that there are 3 particles associated with each hexagonal tile.
#This is because each particle on the border of the tile is really 1/3 of a
#a particle due to it being associated with 3 different hexagonal tiles.
#Since intensity = 3 Particles / Area,
delta <- sqrt(2/(intensity*(sqrt(3))))
#This is derived from the equation for the area of a regular hexagon.
#xcoords and ycoords represent the x and y coordintes of all of the generated points. The 'x' and 'y' are temporary holders for the x and y coordinates of a single horizontal line of points (they are appended to xcoords and ycoords at the end of each while loop).
xcoords <- c()
ycoords <- c()
#The following large while loop calculates the coordinates of the first set of points that are vertically aligned with one another. (alternating horizontal lines of particles) This is shown in the image below.
y_shift <- 0
while (y_shift < MaxYValue) {
x <- c(0)
x_shift <- 0 + delta
count <- 0
while (x_shift < MaxXValue) {
x <- append(x, x_shift)
x_shift <- x_shift + delta
count <- count + 1
}
y <- c(y_shift)
for (i in seq(0,(count-1))) {
y <- append(y, y_shift)
}
y_shift <- y_shift + sqrt(3)*delta
xcoords <- append(xcoords,x)
ycoords <- append(ycoords,y)
}
#The following large while loop calculates the coordinates of the second set of points that are vertically aligned with one another. This is shown in the image below.
y_shift <- 0 + (delta*(sqrt(3)))/2
while (y_shift < MaxYValue) {
x <- c(0 + (1/2)*delta)
x_shift <- 0 + (1/2)*delta + delta
count <- 0
while (x_shift < MaxXValue) {
x <- append(x, x_shift)
x_shift <- x_shift + delta
count <- count + 1
}
y <- c(y_shift)
for (i in seq(0,(count-1))) {
y <- append(y, y_shift)
}
y_shift <- y_shift + sqrt(3)*delta
xcoords <- append(xcoords,x)
ycoords <- append(ycoords,y)
}
hexplot <- ppp(xcoords, ycoords, window=owin(c(0,MaxXValue),c(0,MaxYValue)))
现在,我对 R 还比较陌生,所以很可能是代码中某个地方的语法错误导致了这个错误。或者,可能是我在这个过程中的思路有问题。但是,我认为这不太可能,因为我的结果与我一直在尝试的结果非常接近(大多数时候只有 1-4% 的错误是相当不错的)。
总而言之,我需要帮助的是如何采用一个点图案并创建另一个具有相同窗口大小、具有相同数量粒子但完美的六边形点图案的点图案。
如果您觉得有什么不清楚的地方,请不要犹豫,让我解释清楚。
谢谢!
最佳答案
如果我错了,请原谅我,但我相信鉴于您在示例中显示的约束,您尝试做的事情是不可能的(在一般情况下)。简而言之,你能想出一种方法,在与你的窗口高度和宽度相同的页面上以六边形图案绘制 71 个点吗?我认为这种模式不存在。
为了进一步解释,请考虑代码中的最后一行:
hexplot <- ppp(xcoords, ycoords, window=owin(c(0,MaxXValue),c(0,MaxYValue)))
现在,由于您的窗口与原始数据大小相同,要获得相同的强度,您需要完全相同的点数 (71)。在你的六边形点排列中,你有 x 行,每行包含 y 个点。但是没有整数 x 和 y 可以乘以 71。
也就是说,如果您稍微“拉伸(stretch)”窗口宽度,那么一半的行将包含一个点。这是一个稍微宽松的约束,但不能保证在一般情况下会有解决方案。
因此,要获得完全相同的点强度,您需要能够更改相对窗口大小。您需要将其拉伸(stretch)以添加一些空白并获得较低的点强度。在一般情况下,这仍然可能行不通......但它可能,我还没有解决。从简单的网格开始,然后将代码扩展到六边形可能是最简单的。
查看您的代码,我注意到您正在使用 while
循环,而您本可以使用 seq
函数。例如,如果您想生成从 0 到 MaxXValue
的所有 x
点,增加 sqrt(3)*delta
,只需执行以下操作:
x<-seq(0,MaxXValue,by=delta)
而不是那个大的 while
。这里可能有一些错误,但我认为您可以将整个代码缩减为:
library(spatstat)
data(swedishpines)
swedishpines.df <- as.data.frame(swedishpines)
MaxXValue <- max(swedishpines.df[1])
MaxYValue <- max(swedishpines.df[2])
NumberOfParticles <- nrow(swedishpines.df)
intensity <- NumberOfParticles / (MaxXValue*MaxYValue)
delta <- sqrt(2/(intensity*(sqrt(3))))
x<-seq(0,MaxXValue,by=delta)
y<-seq(0,MaxYValue,by=sqrt(3)*delta)
first.coords=merge(x,y) # Find every combo of x and y
x=seq(delta/2,MaxXValue,by=delta)
y=delta*sqrt(3)/2 + (delta*sqrt(3)*seq(0,length(x)/2))
second.coords=merge(x,y)
coords=rbind(first.coords,second.coords)
ppp(coords$x, coords$y, window=owin(c(0,MaxXValue),c(0,MaxYValue)))
最后,我注意到您在评论中提到六边形的面积是 ( sqrt(3)/2 ) * delta^2
,但不是吗 (3 *sqrt(3)/2) * delta^2
?`
我对 Josh O'Brien 的评论很感兴趣,并决定实现旋转函数以获得所需的确切点数。这是代码:
# Include all above code
rotate=function(deg) {
r=matrix(c(cos(deg),-sin(deg),sin(deg),cos(deg)),byrow=T,nrow=2)
rotated.coords=data.frame(t(r %*% t(as.matrix(coords))))
names(rotated.coords)=c('x','y')
rotated.coords
}
rotate.optim=function(deg) {
rotated.coords=rotate(deg)
abs(NumberOfParticles-length(suppressWarnings(ppp(rotated.coords$x, rotated.coords$y, window=owin(c(0,MaxXValue),c(0,MaxYValue)))$x)))
}
o=optim(0,rotate.optim,lower=0,upper=2*pi,method='Brent')
rotated.coords=rotate(o$par)
rotated.coords.window=rotated.coords[rotated.coords$x >= 0 & rotated.coords$y >= 0 & rotated.coords$x <= MaxXValue & rotated.coords$y <= MaxYValue,]
final=ppp(rotated.coords.window$x,rotated.coords.window$y,window=owin(c(0,MaxXValue),c(0,MaxYValue)))
plot(final)
关于r - 使用 Spatstat 生成六角晶格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11742879/
这可能非常简单,但我花了很多时间试图弄清楚但没有任何运气,也许任何人都可以帮助我。 我通过 spatstat 中的 ppm() 函数拟合了点模式模型(下面的可重现代码),当我绘制残差时,它会自动在残差
我正在分析某些粒子的生长模式,并想将点模式与强度相同(每单位面积的点数相同)的完美六角晶格的点模式进行比较。我已经编写了一个执行此操作的函数,但它有一个固有错误,我不确定它的来源。本质上,在函数运行完
我用 Java 编写了一个核密度估计器,它以 ESRI 形状文件的形式输入并输出估计表面的 GeoTIFF 图像。为了测试这个模块,我需要一个示例 shapefile,并且出于某种原因我被告知要从 R
请允许我以最简单的任务开始这个问题:如果我有四个点,它们是矩形的顶点,并以4x2矩阵存储,如何将其转换为矩形窗口? (请不要使用任何特定于绘制矩形的特殊命令,因为将矩形升高只是为了表示常规几何对象的一
我有两个名为intersections(代表街道系统的交叉路口)和users(代表网络用户)的大型数据框,如下所示: intersections 有三列:x、y 和 label_street。它们分别
我似乎无法找到如何在 R Kest 函数 (spatstat) 中计算搜索距离“r”。包裹documentation陈述如下: r Optional. Vector of values for the
我的目标是分析线性网络上关于欧几里德距离的简单点模式,而不是linearK 中实现的最短路径距离以及 spatstat 及其子函数的相关函数包。浏览网页,我发现了有前途的命名函数 linearKEuc
我试图找到由不规则多边形限制的两点之间的欧几里德距离。 (即,距离必须计算为通过给定窗口的路线) 这是一个可重现的示例: library(spatstat) #Simple example of a
你好所有潜在的帮助者, 我有一个 SpatialPolygonDataFrame从 tigris 获得的对象包,我想在创建 ppp 时将其用作多边形窗口目的。这是我尝试过的: # Needed pac
我不确定点模式分析的有效性我正在尝试使用具有模拟包络的非齐次 L-cross 函数来测试两种类型点之间的空间关联。模拟包络与观察到的数据值的图似乎很奇怪(模拟值非常大),并且它表明抑制而不是聚类(我希
我不确定点模式分析的有效性我正在尝试使用具有模拟包络的非齐次 L-cross 函数来测试两种类型点之间的空间关联。模拟包络与观察到的数据值的图似乎很奇怪(模拟值非常大),并且它表明抑制而不是聚类(我希
所以我遇到的问题很基本,但我似乎无法解决它。我一直在使用 spatstat 的 F、G、J、K 和 L 函数,我想将一个点过程的 F 函数绘制在与另一个点过程的 F 函数相同的图上。这很容易,只是我的
我的最终目标是使用包 spatstat 计算数据帧列表的 Clark-Evans-Index (clarkevans.test)。 所以我有一个我的点数据列表: points.li points.l
我有一组随机片段在 window 中绘制一种镶嵌(三角形、矩形......) (在 spatstat R 中)。我需要将它转换成一组多边形 (SpatialPolygons) 来计算一些指标(如面积、
我是 R spatstat 包的新用户,在使用 owin() 创建多边形观察窗口时遇到问题。代码如下: library("maps") library ("sp")` library("spatsta
在 R 包中 spatstat (我使用的是当前版本, 1.31-0 ),有一个选项 use.gam .当您将此设置为 true 时,您可以在线性预测器中包含平滑项,与使用 R 包 mgcv 相同的方
我是一名优秀的程序员,十分优秀!