Нарисуйте круг с ggplot2
Может быть, это глупый вопрос, но я не смог найти ответ ни в справочнике ggplot2, ни в "тетушке" Google...
Как мне построить круг с ggplot2 в качестве дополнительного слоя, если у меня есть средняя точка и диаметр? Спасибо за вашу помощь.
7 ответов
Более новая и лучшая опция использует пакет расширений под названием 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()
Если цель состоит только в том, чтобы аннотировать окружность, вы можете просто использовать аннотацию с геометрией "путь". Нет необходимости создавать фрейм данных или функцию:
#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)))
Привет следующий код из 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")
Который производит:
Я надеюсь, что вы начали взламывать пользовательские примеры для ваших целей.
С 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)
Для потомков здесь есть более гибкое решение для кругов с использованием annotate и geom_ribbon, которое поддерживает заливку, цвет, альфа и размер.
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)
Также попробуйте это,
ggplot() + geom_rect(aes(xmin=-1,ymin=-1,xmax=1,ymax=1), fill=NA) + coord_polar()
Дело в том, что круг в одной системе координат часто не является кругом в других, если вы не используете geom_point. Возможно, вы захотите обеспечить соотношение сторон 1 с декартовыми координатами.
Просто для полноты: пакет ggforce
от thomasp85 предоставить geom_circle