Zeichne einen Kreis mit ggplot2

Vielleicht ist es eine dumme Frage, aber ich konnte die Antwort weder im Handbuch von ggplot2 noch bei “Tante” google finden …

Wie zeichne ich einen Kreis mit ggplot2 als zusätzliche Ebene, wenn ich einen Mittelpunkt und einen Durchmesser habe? Danke für Ihre Hilfe.

Eine neuere, bessere Option nutzt ein Erweiterungspaket mit dem Namen ggforce , das eine explizite geom_circle geom_circle definiert.

Aber für die Nachwelt, hier ist eine einfache Kreisfunktion:

 circleFun < - function(center = c(0,0),diameter = 1, npoints = 100){ r = diameter / 2 tt <- seq(0,2*pi,length.out = npoints) xx <- center[1] + r * cos(tt) yy <- center[2] + r * sin(tt) return(data.frame(x = xx, y = yy)) } 

Und eine Demonstration seiner Verwendung:

 dat < - circleFun(c(1,-1),2.3,npoints = 100) #geom_path will do open circles, geom_polygon will do filled circles ggplot(dat,aes(x,y)) + geom_path() 

Bildbeschreibung hier eingeben

mit ggplot2 >= 0.9 Sie auch tun

 library(grid) qplot(1:10, 1:10, geom="blank") + annotation_custom(grob=circleGrob(r=unit(1,"npc")), xmin=2, xmax=4, ymin=4, ymax=6) 

Wenn der Zweck nur darin besteht, einen Kreis mit Anmerkungen zu versehen, können Sie einfach einen Kommentar mit Geometrie “Pfad” verwenden. Keine Notwendigkeit, einen Datenrahmen oder eine function zu erstellen:

 #g is your plot #r, xc, yc are the radius and center coordinates g< -g+annotate("path", x=xc+r*cos(seq(0,2*pi,length.out=100)), y=yc+r*sin(seq(0,2*pi,length.out=100))) 

Hi der folgende Code aus der ggplot2 Google- Gruppe kann nützlich sein:

 dat = data.frame(x=runif(1), y=runif(1)) ggplot() + scale_x_continuous(limits = c(0,1)) + scale_y_continuous(limits = c(0,1))+ geom_point(aes(x=x, y=y), data=dat, size=50, shape=1, color="gold4") 

Was produziert: Bildbeschreibung hier eingeben

Ich hoffe, dass Sie damit beginnen, benutzerdefinierte Beispiele für Ihre Zwecke zu hacken.

Für die Nachwelt ist hier eine flexiblere Kreislösung mit Annotate und Geom_Ribbon, die Füllung, Farbe, Alpha und Größe unterstützt.

 gg_circle < - function(r, xc, yc, color="black", fill=NA, ...) { x <- xc + r*cos(seq(0, pi, length.out=100)) ymax <- yc + r*sin(seq(0, pi, length.out=100)) ymin <- yc + r*sin(seq(0, -pi, length.out=100)) annotate("ribbon", x=x, ymin=ymin, ymax=ymax, color=color, fill=fill, ...) } square <- ggplot(data.frame(x=0:1, y=0:1), aes(x=x, y=y)) square + gg_circle(r=0.25, xc=0.5, yc=0.5) square + gg_circle(r=0.25, xc=0.5, yc=0.5, color="blue", fill="red", alpha=0.2) 

Nur der Vollständigkeit ggforce : Das Paket ggforce von thomasp85 liefert geom_circle

Versuchen Sie es auch,

  ggplot() + geom_rect(aes(xmin=-1,ymin=-1,xmax=1,ymax=1), fill=NA) + coord_polar() 

Der Punkt ist, dass ein Kreis in einigen Koordinatensystemen oft kein Kreis in anderen ist, es sei denn, Sie verwenden geom_point. Möglicherweise möchten Sie ein Seitenverhältnis von 1 mit kartesischen Koordinaten sicherstellen.