在磁盘内绘制随机样本

Plot random samples inside a disk

我正在尝试绘制半径为 1 的圆盘内 N 个样本的数据,但我不确定该怎么做。

经过一些研究,runifdisc 似乎是寻找结果的函数,但是,我无法在不产生错误的情况下得到这个函数 运行。 Error in runifdisc(100) : could not find function "runifdisc"

下图展示了我如何绘制数据。我是 R 的新手,如果能深入了解我如何解决这个问题,我将不胜感激。

磁盘均匀分布

double a = random() * 2 * PI
double r = R * sqrt(random())

// Cartesian coordinates
double x = r * cos(a)
double y = r * sin(a)

实际上不需要依赖包来做这件事。推出自己的功能非常容易。这里有两种可能的方法。第一个是粗略的,但也许更容易理解。第二个稍微复杂一些。两者都基于 tidyverse。

library(tidyverse)

选项 1:在正方形内随机生成点,然后过滤以仅保留圆盘内的那些点。

runifdisc1 <- function(k, n=2000) {
  # Crude approach: need to ensure n is sfficiently larger than k to 
  # ensure at least k points lie within the unit curcle
  tibble(x=runif(n, -1, 1), y=runif(n, -1, 1)) %>% 
    filter(x*x + y*y <= 1) %>% 
    head(k) %>% 
    ggplot() +
      geom_point(aes(x=x, y=y)) +
      coord_fixed(ratio=1)
}

runifdisc1(500)

方案二:用极坐标co-ordinates在单位圆盘内生成点,然后变换为笛卡尔坐标co-ordinates。

runifdisc2 <- function(k) {
  # More sophisticated approach: polar co-ordinates
  tibble(theta=runif(k, -pi, pi), r=runif(k), x=r*cos(theta), y=r*sin(theta))%>% 
    ggplot() +
    geom_point(aes(x=x, y=y)) +
    coord_fixed(ratio=1)
}

runifdisc2(500)

应该有直接画极坐标的方法,不知道是什么。谁能给点建议?

回答我自己的问题:

runifdisc3 <- function(k) {
  tibble(theta=runif(k, -pi, pi), r=runif(k)) %>% 
    ggplot() +
    geom_point(aes(x=theta, y=r)) +
    coord_polar("x")
}

runifdisc3(500)