2011-07-28 5 views
40

Может быть, это глупый вопрос, но я не мог найти ответ в руководстве по ggplot2, ни с «тетей» Google ...Нарисуйте круг с ggplot2

Как построить окружность с ggplot2 как дополнительный слой, если у меня средняя точка и диаметр? Спасибо за помощь.

+3

Тетя Google был более отзывчивым ко мне. [Это] (http://groups.google.com/group/ggplot2/browse_thread/thread/7f4238b5658e85bb) может быть полезной. – joran

ответ

50

Более новый, лучший вариант использует дополнительный пакет под названием 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

+0

Спасибо, Джоран, это то, что я ищу ... Мне просто интересно, что вам нужно пойти с функцией, чтобы понять это в ggplot. Если я правильно его помню, у графика есть функция построения для этого. Но эти сюжеты просто выглядят лучше ,-) – Dominik

+0

@ Dominik - Действительно, есть «сетка».circle', но для выполнения этой работы потребуется некоторое знание системы 'grid'. – joran

7

Привет следующий код из 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

Я надеюсь, что это поможет вам начать работу в хакерстве до пользовательских примеров для вашей цели.

+1

Я мог ошибаться, но я не думаю, что этот метод относится к вопросу OP, как рисовать круг * с учетом центра и диаметра *. Будет очень сложно получить правильный диаметр, используя эстетику размера. – joran

+0

Я согласен, это был просто указатель в правильном направлении, а не полное решение. –

+0

Спасибо за подсказку Neo_me, но то, как Джоран отправил, лучше подходит для моих нужд. – Dominik

1

Также попробуйте это,

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

Точка, окружность в некоторой системе координат часто не является кругом в других, если вы не используете geom_point. Возможно, вы захотите обеспечить соотношение сторон 1 с декартовыми координатами.

+0

То, что я хочу построить, является горизонтом важности на участке рассеяния. Для этого решение jorans кажется лучшим. Но большое спасибо за ваш намек. – Dominik

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) 
+0

Это изменяет размер с размером холста. – SigmaX

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

Ради потомства здесь является более гибким решением круга с помощью аннотаций и 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) 
2

Просто для полноты: Пакет ggforce по thomasp85 обеспечивают geom_circle

Смежные вопросы