Concentric Circles like a grid, centered at origin

Viewed 1574

I would like to include a sequence of concentric circles as a grid in a plot of points. The goal is to give the viewer an idea of which points in the plot have approximately the same magnitude. I created a hack to do this:

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)

But I was wondering if there is a more ggplot way to do this. I also considered using polar coordinates but it does not allow me to set x- and y-limits in the same way. Finally, I wouldn't mind little text labels indicating the radius of each circle.

EDIT Perhaps this is asking too much but there are two other things that I would like.

  1. The axis limits should stay the same (which can be done via ggplot_build)
  2. Can this work with facets? As far as I can tell you would need to somehow figure out the facets if I want to add the circles dynamically.
2 Answers
Related