2013-12-23 2 views
5

Я хотел бы включить последовательность концентрических кругов в виде сетки в графике точек. Цель состоит в том, чтобы дать зрителю представление о том, какие точки сюжета имеют примерно такую ​​же величину. Я создал хак, чтобы сделать это:Концентрические круги, как сетка, с центром в начале координат

add_circle_grid <- function(g,ncirc = 10){ 
    gb <- ggplot_build(g) 
    xl <- gb$panel$ranges[[1]]$x.range 
    yl <- gb$panel$ranges[[1]]$y.range 
    rmax = sqrt(max(xl)^2+max(yl)^2) 
    theta=seq(from=0,by=.01,to=2*pi) 
    for(n in 1:ncirc){ 
    r <- n*rmax/ncirc 
    circle <- data.frame(x=r*sin(theta),y=r*cos(theta)) 
    g<- g+geom_path(data=circle,aes(x=x,y=y),alpha=.2) 
    } 
    return(g+xlim(xl)+ylim(yl)) 
} 

xy<-data.frame(x=rnorm(100),y=rnorm(100)) 
ggplot(xy,aes(x,y))+geom_point() 
ggg<-add_circle_grid(ggplot(xy,aes(x,y))+geom_point()) 
print(ggg) 

Но мне было интересно, если есть более ggplot способ сделать это. Я также рассматривал использование полярных координат, но это не позволяет мне устанавливать x- и y-пределы таким же образом. Наконец, я бы не возражал против небольших текстовых меток, указывающих радиус каждого круга.

EDIT Возможно, это слишком много, но есть две другие вещи, которые мне бы хотелось.

  1. Пределы оси должны оставаться тем же (что может быть сделано с помощью ggplot_build)
  2. это может работать с гранями? Насколько я могу судить, вам нужно каким-то образом выяснить грани, если я хочу динамически добавлять круги.
+0

Кажется ответы предлагают есть способы сделать это :-) Еще интересно если есть способ сделать это, используя полярные координаты. – dpmcsuss

ответ

6

enter image description here

set.seed(1) 
xy <- data.frame(x=rnorm(100),y=rnorm(100)) 
rmax = sqrt(max(xy$x)^2+max(xy$y)^2) 
theta=seq(from=0,by=.01,to=2*pi) 
ncirc=10 

dat.circ = do.call(rbind, 
    lapply(seq_len(ncirc),function(n){ 
    r <- n*rmax/ncirc 
    data.frame(x=r*sin(theta),y=r*cos(theta),r=round(r,2)) 
})) 

rr <- unique(dat.circ$r) 

dat.text=data.frame(x=rr*cos(30),y=rr*sin(30),label=rr) 

library(ggplot2) 

ggplot(xy,aes(x,y))+ 
    geom_point() + 
    geom_path(data=dat.circ,alpha=.2,aes(group=factor(r))) + 
    geom_text(data=dat.text,aes(label=rr),vjust=-1) 
+0

Это выглядит красиво! Благодаря! – dpmcsuss

5

Как об этом с ggplot2 и grid:

require(ggplot2) 
require(grid) 

x<-(runif(100)-0.5)*4 
y<-(runif(100)-0.5)*4 

circ_rads<-seq(0.25,2,0.25) 

qplot(x,y)+ 
    lapply(circ_rads,FUN=function(x)annotation_custom(circleGrob(gp=gpar(fill="transparent",color="black")),-x,x,-x,x))+ 
    geom_text(aes(x=0,y=circ_rads+0.1,label=circ_rads)) + coord_fixed(ratio = 1) 

enter image description here

+0

Мне тоже нравится. – dpmcsuss

+2

Помните, что нанесенные круги не являются кругами относительно пространства данных. Радиус в направлении x составляет 1,5 единицы, но в направлении y - 2,0 единицы. Добавление команды '+ coord_fixed (ratio = 1)' в команду построения графика может оказаться полезным. – bdemarest

+0

Хороший момент, и исправлено – Troy

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