2011-07-28 30 views
40

Peut-être est une question stupide, mais je ne pouvais pas trouver la réponse dans le manuel de ggplot2 ni avec « tante » google ...Tracez un cercle avec ggplot2

Comment tracer un cercle avec ggplot2 comme une couche supplémentaire si j'ai un point milieu et un diamètre? Merci pour votre aide.

+3

tante Google était plus sensible pour moi. [This] (http://groups.google.com/group/ggplot2/browse_thread/thread/7f4238b5658e85bb) peut être utile. – joran

Répondre

50

Une nouvelle option, meilleure, exploite un package d'extension appelé ggforce qui définit une explication geom_circle.

Mais pour l'amour de la postérité, voici une fonction simple cercle:

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

Et une démonstration de son utilisation:

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

Merci Joran, c'était ce que je cherchais ... Je me demandais juste, que vous devez aller avec la fonction pour réaliser cela dans ggplot. Si je me souviens bien, l'intrigue a une fonction de construction pour cela. Mais ces tracés sont simplement plus beaux ;-) – Dominik

+0

@Dominik - En effet, il y a 'grid.circle', mais pour que ce travail nécessite une certaine connaissance du système 'grid'. – joran

7

Salut le code suivant de ggplot2 Google groupe peut être utile:

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

qui produit: enter image description here

J'espère que cela vous permet de démarrer dans le piratage des exemples personnalisés à vos besoins.

+1

Je peux me tromper, mais je ne pense pas que cette méthode aborde la question de l'OP, qui était de savoir comment dessiner un cercle * étant donné un centre et un diamètre *. Il sera très difficile d'obtenir le bon diamètre en utilisant la taille esthétique. – joran

+0

Ya je suis d'accord, c'était juste un indicateur dans la bonne direction pas une solution complète. –

+0

Merci pour cet indice Neo_me, mais la façon dont Joran a posté correspond mieux à mes besoins. – Dominik

1

Essayez aussi cela,

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

Le point étant, un cercle dans un système de coordonnées n'est souvent pas un cercle dans d'autres, sauf si vous utilisez geom_point. Vous pourriez vouloir assurer un ratio d'aspect de 1 avec des coordonnées cartésiennes.

+0

Ce que je veux tracer est un horizon d'importance sur un nuage de points. Pour cette solution jorans semble être le meilleur moyen. Mais merci beaucoup pour votre indice. – Dominik

13

avec ggplot2 >= 0.9 vous pouvez également faire

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

Cela change la taille avec la taille de la toile. – SigmaX

13

Si le but est seulement d'annoter un cercle, vous pouvez simplement utiliser annoter avec la géométrie « chemin ». Pas besoin de créer une trame de données ou la fonction:

#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

Pour l'amour de la postérité est ici une solution de cercle plus flexible en utilisant annoter et geom_ribbon qui prend en charge remplissage, la couleur, l'alpha et la taille.

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

Juste pour être complet: Le paquet ggforce par thomasp85 fournissent geom_circle