2011-07-28 40 views
40

Tal vez sea una pregunta tonta, pero no pude encontrar la respuesta en el manual de ggplot2 ni con la "tía" Google ...Dibuje un círculo con ggplot2

¿Cómo trazar un círculo con ggplot2 como una capa adicional si tengo un punto medio y un diámetro? Gracias por su ayuda.

+3

tía Google era más sensible a mí. [Este] (http://groups.google.com/group/ggplot2/browse_thread/thread/7f4238b5658e85bb) podría ser de alguna ayuda. – joran

Respuesta

50

Una opción más nueva y mejor aprovecha un paquete de extensión llamado ggforce que define un explicity geom_circle.

Sin embargo, para la posteridad, aquí es una simple función de círculo:

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

y una demostración de su uso:

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

Gracias Joran, eso es lo que estoy buscando ... Solo me pregunto, tienes que ir con la función para darte cuenta de eso en ggplot. Si lo recuerdo correctamente, la trama tiene una función de compilación para eso. Pero estas tramas se ven mucho mejor ;-) – Dominik

+0

@Dominik - De hecho, hay 'rejilla.circle', pero para hacer que funcione se necesitará cierto conocimiento del sistema 'grid'. – joran

7

Hola el siguiente código de ggplot2 Google grupo puede ser útil:

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

que produce: enter image description here

espero que le ayudará a comenzar en la piratería hasta ejemplos personalizados para su propósito.

+1

Podría estar equivocado, pero no creo que este método aborde la pregunta del OP, que fue cómo dibujar un círculo * dado un centro y diámetro *. Será muy difícil obtener el diámetro correcto utilizando el tamaño estético. – joran

+0

Ya estoy de acuerdo, era solo un puntero en la dirección correcta, no una solución completa. –

+0

Gracias por esa pista, Neo_me, pero la forma en que Joran publicó encaja mejor para mis necesidades. – Dominik

1

también probar esto,

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

El punto es que un círculo en un sistema de coordenadas a menudo no es un círculo en otros, a menos que use geom_point. Es posible que desee garantizar una relación de aspecto de 1 con coordenadas cartesianas.

+0

Lo que quiero trazar es un horizonte de importancia en un diagrama de dispersión. Para esta solución jorans parece ser la mejor manera. Pero muchas gracias por su pista también. – Dominik

13

con ggplot2 >= 0.9 también se puede hacer

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

Esto cambia el tamaño con el tamaño del lienzo. – SigmaX

13

Si el propósito es sólo para anotar un círculo, puede simplemente usar anotaciones con "camino" geometría. No es necesario crear un marco o función de datos:

#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

Por el bien de la posteridad aquí es una solución más flexible círculo usando anotar y geom_ribbon que apoya a llenar, el color, el alfa y el tamaño.

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

simplemente para la corrección: El paquete ggforce por thomasp85 proporcionan geom_circle