web-dev-qa-db-fra.com

Dessinez un cercle avec ggplot2

C'est peut-être une question idiote, mais je n'ai pas trouvé la réponse dans le manuel de ggplot2 ni avec "tante" google ...

Comment puis-je tracer un cercle avec ggplot2 comme couche supplémentaire si j'ai un point médian et un diamètre? Merci de votre aide.

54
Dominik

Une option plus récente et meilleure exploite un package d'extension appelé ggforce qui définit une explicité geom_circle.

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

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

67
joran

Si le but est seulement d'annoter un cercle, vous pouvez simplement utiliser l'annotation avec la géométrie "chemin". Pas besoin de créer un bloc de données ou une 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)))
13
Luis

avec ggplot2 >= 0.9 vous pouvez aussi 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)
13
baptiste

Salut le code suivant de ggplot2 Google group 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")

Ce qui produit: enter image description here

J'espère que cela vous aidera à pirater des exemples personnalisés pour votre objectif.

9
Shreyas Karnik

Pour la postérité, voici une solution de cercle plus flexible utilisant annotate et geom_ribbon qui prend en charge le 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)
5
Trevor

Essayez aussi ceci,

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

Le fait est qu'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 voudrez peut-être assurer un rapport d'aspect de 1 avec des coordonnées cartésiennes.

3
baptiste

Juste pour être complet: le package ggforce de thomasp85 fournit geom_circle

0
Ulrik