2013-12-23 3 views
5

Ich möchte eine Folge von konzentrischen Kreisen als Gitter in einer Zeichnung von Punkten enthalten. Ziel ist es, dem Betrachter eine Vorstellung davon zu geben, welche Punkte in der Handlung ungefähr gleich groß sind. Ich habe einen Hack, dies zu tun:Konzentrische Kreise wie ein Gitter, zentriert am Ursprung

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) 

Aber ich frage mich, ob es ein ggplot Weg, dies zu tun. Ich habe auch überlegt, Polarkoordinaten zu verwenden, aber es erlaubt mir nicht, x- und y-Grenzen auf die gleiche Weise festzulegen. Schließlich hätte ich nichts dagegen, kleine Textbeschriftungen, die den Radius jedes Kreises angeben.

BEARBEITEN Vielleicht ist dies zu viel verlangt, aber es gibt zwei andere Dinge, die ich möchte.

  1. Die Achsgrenzen sollten gleich bleiben
  2. können diese Arbeit mit Facetten (die über ggplot_build getan werden kann)? Soweit ich das beurteilen kann, müssten Sie die Facetten irgendwie herausfinden, wenn ich die Kreise dynamisch hinzufügen möchte.
+0

Es scheint, dass die Antworten deuten darauf hin, es gibt Möglichkeiten, es :-) noch zu tun fragen wenn es einen Weg gibt, es mit Polarkoordinaten zu machen. – dpmcsuss

Antwort

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

Das sieht gut aus! Vielen Dank! – dpmcsuss

5

Wie wäre dies mit ggplot2 und 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

Ich mag das auch. – dpmcsuss

+2

Beachten Sie, dass die gezeichneten Kreise keine tatsächlichen Kreise bezüglich des Datenraums sind. Der Radius in der x-Richtung beträgt 1,5 Einheiten, aber in der y-Richtung beträgt er 2,0 Einheiten. Das Hinzufügen von '+ coord_fixed (ratio = 1)' zum Plotten-Befehl könnte nützlich sein. – bdemarest

+0

Ein guter Punkt, und korrigiert – Troy