我试图通过显示网格中每个像素的交叉数来传达2D空间中线的集中度。我正在描绘类似于密度图的东西,但是单位更直观。我被spatstat包及其线段类(psp)吸引住了,因为它允许您通过其端点定义线段并将整条线合并到计算中。但是,我正在努力找到正确的功能组合来统计这些计数,并且希望您提出任何建议。
如下面的示例(每行50条)所示,density函数在(0,140)中生成值,pixellate函数计算通过每个像素的总长度,并在(0,0.04)中获取值,而as.mask生成是否为一条线穿过每个像素。我希望看到标度采用整数值(例如0..10)的东西。
require(spatstat)
set.seed(1234)
numLines = 50
# define line segments
L = psp(runif(numLines),runif(numLines),runif(numLines),runif(numLines), window=owin())
# image with 2-dimensional kernel density estimate
D = density.psp(L, sigma=0.03)
# image with total length of lines through each pixel
P = pixellate.psp(L)
# binary mask giving whether a line went through a pixel
B = as.mask.psp(L)
par(mfrow=c(2,2), mar=c(2,2,2,2))
plot(L, main="L")
plot(D, main="density.psp(L)")
plot(P, main="pixellate.psp(L)")
plot(B, main="as.mask.psp(L)")
pixellate.psp函数使您可以选择指定要在计算中使用的权重。我考虑过尝试对像素进行归一化处理,以使每个交叉点的像素计数为1,但是权重唯一地应用于每条线(而不是特定于线/像素对)。我还考虑过为每行计算一个二进制掩码并添加结果,但是似乎应该有一种更简单的方法。我知道您可以沿一条线采样点,然后按像素对点进行计数。但是,我担心正确采样,以使像素的每条线交叉只有一个点。
在R中是否有简单的方法可以做到这一点?否则,这将是对将来的软件包增强的适当建议吗?使用其他语言(例如python或matlab)更容易完成此操作吗?
上面的示例和我的测试是使用x86_64-w64-mingw32上的spatstat 1.40-0,R 3.1.2。
您完全正确的认为这是将来的改进。它将在spatstat的下一版本中完成。pixellate.psp
计算交叉线的数量而不是测量总长度可能是一种选择。
现在,您必须做一些令人费解的事情,例如:
require(spatstat)
set.seed(1234)
numLines = 50
# define line segments
L <- psp(runif(numLines),runif(numLines),runif(numLines),runif(numLines), window=owin())
# split into individual lines and use as.mask.psp on each
masklist <- lapply(1:nsegments(L), function(i) as.mask.psp(L[i]))
# convert to 0-1 image for easy addition
imlist <- lapply(masklist, as.im.owin, na.replace = 0)
rslt <- Reduce("+", imlist)
# plot
plot(rslt, main = "")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句