web-dev-qa-db-fra.com

cercle de dessin dans R

Je ne sais pas pourquoi le code suivant ne me donne pas le cercle complet et n'en donne qu'une partie. Aussi, je ne sais pas comment je peux montrer mes points sur le cercle ou à l'extérieur de celui-ci dans un carré centré à (0,0) avec r = 1 et 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)

Voici la sortieenter image description here

Je l'ai donc fixée à ce qui suit et quand j'ai 100 points, le graphique a l'aspect suivant. Pourquoi le cercle complet n'est pas montré?

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

enter image description here

Donc, grâce à Fernando, j'ai corrigé l'intrigue et maintenant, il ressemble à ceci, mais je veux qu'il soit compris entre (-1 et 1) pour x comme pour y. xlim n'a pas fonctionné. Savez-vous ce qui ne va pas?

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)
  }
}

et appelez la fonction comme suit:

monte.carlo.pi(100,T)

l'intrigue actuelle est comme suit: enter image description here

11
Mona Jalal

Vous devez spécifier 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

EDIT: Juste une note de côté, vous pouvez rendre votre fonction Monte Carlo plus efficace:

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
}
17
Fernando

La réponse de Fernando est bonne si vous voulez que le cercle ressemble réellement à un cercle pour l'utilisateur . Cette réponse couvre le dessin d’un cercle dans les dimensions de données .

Si vos axes x et y sont redimensionnés de la même manière, par exemple, Si vous définissez votre format d'image sur 1 (asp = 1), les deux méthodes sont équivalentes.

# 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))
20
Gregor