用ggplot2画一个圆圈

时间:2011-07-28 16:58:30

标签: r ggplot2 geometry

也许这是一个愚蠢的问题,但我无法在ggplot2的手册中找到答案,也无法在"阿姨"谷歌...

如果我有一个中点和一个直径,如何用ggplot2绘制一个圆作为附加图层? 谢谢你的帮助。

7 个答案:

答案 0 :(得分:66)

更新,更好的选项会利用名为ggforce的扩展程序包来定义明确geom_circle

但为了后人的缘故,这是一个简单的循环函数:

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

并展示它的使用:

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

答案 1 :(得分:13)

使用ggplot2 >= 0.9您也可以

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)

答案 2 :(得分:13)

如果目的只是注释一个圆圈,你可以简单地使用带几何“路径”的注释。无需创建数据框或功能:

#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 :(得分:9)

以下来自ggplot2 Google群组的代码可能很有用:

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

哪个产生: enter image description here

我希望它可以让你开始为自己的目的破解自定义示例。

答案 4 :(得分:5)

为了后人,这里有一个更灵活的圆形解决方案,使用annotate和geom_ribbon,支持填充,颜色,alpha和大小。

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 :(得分:2)

也试试这个,

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

重点是,除非使用geom_point,否则某些坐标系中的圆圈通常不是其他圆圈。您可能希望使用笛卡尔坐标确保纵横比为1。

答案 6 :(得分:2)

为了完整起见:thomasp85提供的ggforce包提供了geom_circle