Рисование круга в R

Я не знаю, почему следующий код не дает мне полный круг и дает только его части. Также я не знаю, как я могу показать свои точки на круге или вне его в квадрате с центром в (0,0) с r = 1 и a = 2.

library("plotrix")
n<-1000
plot.new()
frame()
x<-runif(n,-1,1)
y<-runif(n,-1,1)
for (i in 1:n) { plot(x[i],y[i])}
draw.circle(0,0,1,nv=1000,border=NULL,col=NA,lty=1,lwd=1)

Здесь вывод enter image description here

Итак, я исправил его до следующего, и когда у меня есть 100 точек, график выглядит следующим образом. Почему полный круг не отображается?

plot(x,y)
draw.circle(0,0,1,nv=1000,border=NULL,col=NA,lty=1,lwd=1)

enter image description here

Итак, благодаря Fernando я зафиксировал сюжет, и теперь он выглядит так, но я хочу, чтобы он имел диапазон от (-1 до 1) для x, как и для y. xlim не работает. Вы знаете, что неправильно?

magnitude = function(x, y) {
  stopifnot(isTRUE(all.equal(length(x),length(y))))
  return (sqrt(x^2 + y^2))
}
library("plotrix")
monte.carlo.pi<-function(n,draw=FALSE)
{
  circle.points<-0
  square.points<-0
  x<-runif(n,-1,1)
  y<-runif(n,-1,1)
  for (i in 1:n)
  {
    #if ((x[i])^2 + (y[i])^2 <=1)
    if (magnitude(x[i],y[i])<=1)
    {
      circle.points<-circle.points+1
      square.points<-square.points+1
    } else
    {
      square.points<-square.points+1
    }
  }
  if (draw==TRUE)
  {
    plot.new()
    frame()
    plot(x,y,asp=1,xlim=c(-1,1),ylim=c(-1,1))
    draw.circle(0,0,1,nv=1000,border=NULL,col=NA,lty=1,lwd=1)
    rect(-1,-1,1,1)
    return(4*circle.points / square.points)
  }
}

и вызовите функцию следующим образом:

monte.carlo.pi(100,T)

Текущий график выглядит следующим образом: enter image description here

Ответ 1

Вам нужно указать asp = 1:

x = runif(100, -1, 1)
y = runif(100, -1, 1)
plot(x, y, asp = 1, xlim = c(-1, 1))
draw.circle(0, 0, 1, nv = 1000, border = NULL, col = NA, lty = 1, lwd = 1)

enter image description here

РЕДАКТИРОВАТЬ: только боковое примечание, вы можете сделать вашу функцию Монте-Карло более эффективной:

mc.pi = function(n) {

  x = runif(n, -1, 1)
  y = runif(n, -1, 1)
  pin = sum(ifelse(sqrt(x^2 + y^2 <= 1), 1, 0))
  4 * pin/n
}

Ответ 2

Ответ Фернандо хорош, если вы хотите, чтобы круг действительно выглядел как круг для пользователя. Этот ответ охватывает рисование круга в размерах данных.

Если ваши оси x и y масштабируются одинаково, например, если вы установите соотношение сторон к 1 (asp = 1), то два метода эквивалентны.

# initialize a plot
plot(c(-1, 1), c(-1, 1), type = "n")

# prepare "circle data"
radius <- 1
theta <- seq(0, 2 * pi, length = 200)

# draw the circle
lines(x = radius * cos(theta), y = radius * sin(theta))

Ответ 3

Как уже указывал Грегор, вы должны различать, имеют ли x и y одинаковый масштаб при рисовании круга. В случае, когда x и y имеют одинаковый масштаб, я предпочитаю использовать символы для рисования круга в R. Это делается без указания вершин и не требует дополнительной библиотеки.

n <- 1000
set.seed(0)
x <- runif(n, -1, 1)
y <- runif(n, -1, 1)

#x and y have the same scale -> Circle
plot(x, y, asp=1)
symbols(x=0, y=0, circles=1, inches=F, add=T)

#In case x and y don't have the same scale -> Ellipse
#Use Gregor Answer
plot(x,y)
radius <- 1
theta <- seq(0, 2 * pi, length = 200)
lines(x = radius * cos(theta), y = radius * sin(theta))

#Using plotrix
library("plotrix")
plot(x, y, asp=1)
draw.circle(x=0, y=0, radius=1)

plot(x,y)
draw.ellipse(x=0, y=0, a=1, b=1)