【问题标题】:Why is plot not generating all of my points?为什么情节没有产生我的所有观点?
【发布时间】:2021-03-14 17:06:40
【问题描述】:

当我使用 plot 命令绘制 900 个点时,只选择了 30 个。具体来说,30 个“父”点将我的 Matern 集群算法基于我的代码早期。我正在生成具有指定点数的 Matern 集群过程,因为我需要在不同的地块之间进行比较。因此,为什么我不使用 spatstat 功能。此外,所有点似乎都偏向 y 轴上的较低值,我无法弄清楚发生了什么。

我最初通过定义地块的尺寸来生成我正在使用的景观。

xMin<--0
xMax<-1000
yMin<--0
yMax<-1000

然后我定义我的集群的半径,我选择不使用泊松分布,因为我需要一定数量的点,所以没有指定强度。

radiusCluster<-0.1

然后我计算窗口上落在观察窗口之外的点的扩展。

rExt<-radiusCluster
xMinExt<-xMin-rExt
xMaxExt<-xMax+rExt
yMinExt<-yMin-rExt
yMaxExt<-yMax+rExt
xDeltaExt<-xMaxExt-xMinExt
yDeltaExt<-yMaxExt-yMinExt

然后我定义父点的数量及其在窗口中的位置。

numbparents<-30
xxParent<-xMinExt+xDeltaExt*runif(numbparents)
yyParent<-yMinExt+yDeltaExt**runif(numbparents)

然后我定义子点的数量和它们的笛卡尔坐标

numbdaughter<-30

theta=2*pi*runif(numbdaughter)
rho=radiusCluster*sqrt(runif(numbdaughter))
xx0<-rho*cos(theta)
yy0<-rho*sin(theta)

然后我复制父点的位置与子点的数量相同,并转换坐标以生成聚类。

xx=rep(xxParent,numbdaughter);
yy=rep(yyParent,numbdaughter);

xx=xx+xx0;
yy=yy+yy0

但是,当我绘制这个时,即使有 900 个点,也只会生成父点。此外,大多数都在 y 轴的底部附近,每次我做图时,我都不明白,因为我使用了随机数函数,所以它们应该均匀分布在图上。

plot(xx,yy,xlab='x',ylab='y',col='blue')

我需要做什么来绘制所有的点,并让 runif 在指定的范围内绘制均匀分布?

【问题讨论】:

  • 不确定你想达到什么目标,但你只有 30 个独特的 x,y 位置:nrow(unique(cbind(xx, yy))) 给出 30
  • 我没有遍历所有代码,但是如果 first 代码行是xMin&lt;--0,意味着将-0 分配给一个变量,并且这种奇怪的分配重复后面2行,那么肯定还有其他错误。

标签: r plot


【解决方案1】:

样本数据中只有 30 个唯一值。这可以通过以下方式看到(@zx8754 评论)

nrow(unique(cbind(xx, yy)))
[1] 30

发生这种情况的原因是随机函数runif 被调用一次,然后rep 重复使用相同的数字,这导致计算出重复的值。以下示例显示了这一点,该示例多次返回相同的值:

set.seed(7)
rep(5 + runif(1), 5)
[1] 5.988909 5.988909 5.988909 5.988909 5.988909

这是使用replicate 多次调用随机函数以获得唯一结果的一种方法。

问题的值:

set.seed(7)

xMin <- 0
xMax <- 1000
yMin <- 0
yMax <- 1000
radiusCluster <- 0.1
rExt <- radiusCluster
xMinExt <- xMin - rExt
xMaxExt <- xMax + rExt
yMinExt <- yMin - rExt
yMaxExt <- yMax + rExt
xDeltaExt <- xMaxExt - xMinExt
yDeltaExt <- yMaxExt - yMinExt
numbparents <- 30
xxParent <- xMinExt + xDeltaExt * runif(numbparents)
yyParent <- yMinExt + yDeltaExt ** runif(numbparents) # not sure if ** is typo
numbdaughter <- 30

使用replicate 为每个女儿生成新号码

xx <- as.vector(replicate(numbdaughter, xxParent + radiusCluster * sqrt(runif(numbdaughter)) * cos(2 * pi * runif(numbdaughter))))
yy <- as.vector(replicate(numbdaughter, yyParent + radiusCluster * sqrt(runif(numbdaughter)) * sin(2 * pi * runif(numbdaughter))))

验证生成的 900 个唯一值:

nrow(unique(cbind(xx, yy)))
[1] 900

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    相关资源
    最近更新 更多