2012-08-16 10 views
10

Intento obtener escala libre con aspecto = 1, pero el mismo rango en x/y en cada panel. En el ejemplo siguiente, esto significa que x-scaling en b debe ser (-0.04,0.04).Escala libre, pero el mismo rango por panel en x/y

Editado: se ha añadido la versión de celosía

library(ggplot2) 
d = data.frame(x=rnorm(100),group=c("A","B")) 
d$y = d$x+rnorm(100,0,0.5) 
d[d$group=="B","x"]=d[d$group=="B","x"]/100 
d[d$group=="B","y"]=d[d$group=="B","y"]/60 
qplot(x,y,data=d,asp=1) + facet_wrap(~group,scale="free") 

require(lattice) 
xyplot(y~x|group, data=d,aspect=1,scales=list(relation="free"), 
    prepanel=function(x,y){ 
    lims = c(min(x,y), max(x,y)) 
    list(xlim=lims,ylim=lims) 
    }) 

in each panel, the x and y range should be the same

+1

+1 Buena pregunta . Jugueteé, pero no pude hacer que funcionara como me pediste. – Andrie

+4

@Andrie: Como un enrejado de lana en la lana, primero pensé que era solo mi ignorancia partidista. Después de tu comentario, encontré un hilo [https://groups.google.com/forum/?fromgroups#!topic/ggplot2/cDzL_yHew0I[1-25]] que indica que esto no es tan fácil en ggplot2. –

+0

Parece que olvidé el negativo: http://stackoverflow.com/questions/7905828/multi-panel-plots-in-ggplot2-scales-that-are-free-and-equal?rq=1 –

Respuesta

6

Como la última versión del ggplot2 utiliza gtable internamente, se puede hacer este tipo de tareas con bastante facilidad:

d = data.frame(x=rnorm(100),group=c("A","B")) 
d$y = d$x+rnorm(100,0,0.5) 
d[d$group=="B","x"]=d[d$group=="B","x"]/100 
d[d$group=="B","y"]=d[d$group=="B","y"]/60 

# create plots for each level of group 
p <- lapply(levels(d$group), 
    function(i) { 
    dat <- subset(d, group == i) 
    lim <- range(c(dat$x, dat$y)) 
    ggplot_gtable(ggplot_build(qplot(x,y,data=dat,asp=1) + 
     facet_wrap(~group,scale="free") + 
     coord_equal() + 
     xlim(lim) + ylim(lim))) 
    }) 

# tweaking margins 
p[[1]] <- p[[1]][, -6] 
p[[2]] <- p[[2]][, -(1:2)] 

# draw it 
grid.newpage() 
grid.draw(cbind(p[[1]], p[[2]], size = "first")) 

enter image description here

+0

Gracias, @kohske, pero la solución de celosía que usa prepanel parece ser mucho más simplificada para mí. –

+0

+1, aunque tengo que estar de acuerdo con Dieter, la fortaleza de ggplot es normalmente el hecho de que no hay necesidad de detalles de bajo nivel. –

Cuestiones relacionadas