2011-07-28 21 views
40

Może to głupie pytanie, ale nie mogę znaleźć odpowiedzi w Handbook of ggplot2 ani z „ciotką” google ...Narysuj okrąg o ggplot2

Jak mogę wykreślić okrąg o ggplot2 jako dodatkowa warstwa, jeśli mam środkowy punkt i średnicę? Dzięki za pomoc.

+3

ciocia Google był bardziej wrażliwy na mnie. [To] (http://groups.google.com/group/ggplot2/browse_thread/thread/7f4238b5658e85bb) może być pomocne. – joran

Odpowiedz

50

Nowsza, lepsza opcja wykorzystuje pakiet rozszerzeń o nazwie ggforce, który definiuje explicity geom_circle.

ale dla potomności, oto prosta funkcja koło:

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

A demonstracja nim znajduje zastosowanie:

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

enter image description here

+0

Dzięki Joran, właśnie tego szukam ... Zastanawiam się, że musisz użyć tej funkcji, aby uświadomić to sobie w ggplot. Jeśli dobrze pamiętam, fabuła ma do tego funkcję kompilacji. Ale te działki wyglądają po prostu ładniej ;-) – Dominik

+0

@Dominik - Rzeczywiście istnieje "siatka.circle', ale aby ta praca wymagała pewnej wiedzy o systemie 'grid'. – joran

7

Hi następujący kod z ggplot2 Google grupy mogą być użyteczne:

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

która produkuje: enter image description here

Mam nadzieję, że zostanie uruchomiony w hackingu się przykłady niestandardowych dla Twojego celu.

+1

Mogę się mylić, ale nie sądzę, że ta metoda odnosi się do pytania OP, w jaki sposób narysować okrąg * ze względu na środek i średnicę *. Będzie bardzo trudno uzyskać odpowiednią średnicę przy użyciu estetyki rozmiaru. – joran

+0

Zgadzam się, to był tylko wskaźnik w dobrym kierunku, a nie kompletne rozwiązanie. –

+0

Dzięki za podpowiedź Neo_me, ale sposób w jaki Joran pisał lepiej pasuje do moich potrzeb. – Dominik

1

także spróbować tego,

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

W tym punkcie okrąg w niektórych układach współrzędnych często nie jest kołem w innych, chyba że używasz geom_point. Możesz chcieć zapewnić współczynnik kształtu 1 o współrzędnych kartezjańskich.

+0

To, co chcę wydrukować, to horyzont ważności na działce rozproszonej. Dla tego rozwiązania jorans wydaje się być najlepszym sposobem. Ale bardzo dziękuję za twoją podpowiedź. – Dominik

13

z ggplot2 >= 0.9 można też zrobić

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) 
+0

Zmienia rozmiar z rozmiarem płótna. – SigmaX

13

Jeśli celem jest tylko do opisywania okrąg, można po prostu użyć adnotacji z geometrii „ścieżka”. Nie ma potrzeby, aby utworzyć ramkę danych lub funkcji:

#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))) 
3

Dla dobra potomności tu jest bardziej elastyczne rozwiązanie koło za pomocą adnotacji i geom_ribbon który obsługuje wypełnienia, kolor, alfa i rozmiar.

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

Tylko dla kompletności: Pakiet ggforce przez thomasp85 zapewnić geom_circle