2011-08-19 13 views
14

Contexto

Quiero trazar dos ggplot2 en la misma página con la misma leyenda. http://code.google.com/p/gridextra/wiki/arrangeGrob describe cómo hacerlo. Esto ya se ve bien. Pero ... En mi ejemplo tengo dos parcelas con el mismo eje xy diferentes ejes y. Cuando el rango del eje y es al menos 10 veces más alto que el del otro gráfico (por ejemplo, 10000 en lugar de 1000), ggplot2 (¿o cuadrícula?) No alinea las representaciones correctas (ver Salida a continuación).Alinear varias ggplot2 gráficas con la cuadrícula

Pregunta

¿Cómo se alinean también la parte izquierda de la trama, el uso de dos eje y diferente?

Código Ejemplo

x = c(1, 2) 
y = c(10, 1000) 
data1 = data.frame(x,y) 
p1 <- ggplot(data1) + aes(x=x, y=y, colour=x) + geom_line() 

y = c(10, 10000) 
data2 = data.frame(x,y) 
p2 <- ggplot(data2) + aes(x=x, y=y, colour=x) + geom_line() 


# Source: http://code.google.com/p/gridextra/wiki/arrangeGrob 
leg <- ggplotGrob(p1 + opts(keep="legend_box")) 
legend=gTree(children=gList(leg), cl="legendGrob") 
widthDetails.legendGrob <- function(x) unit(3, "cm") 
grid.arrange(
    p1 + opts(legend.position="none"), 
    p2 + opts(legend.position="none"), 
    legend=legend, main ="", left = "") 

salida

Example image

+1

Ver: http://stackoverflow.com/questions/13294952/left-align-two-g raph-edges-ggplot/13295880 # 13295880? –

Respuesta

7

Si no te importa un kludge descarado, sólo tiene que añadir un carácter adicional a la etiqueta más larga de p1, así:

p1 <- ggplot(data1) + 
    aes(x=x, y=y, colour=x) + 
    geom_line() + 
    scale_y_continuous(breaks = seq(200, 1000, 200), 
         labels = c(seq(200, 800, 200), " 1000")) 

Tengo dos preguntas subyacentes , que espero que perdonará si tiene sus razones:

1) ¿Por qué no utilizar el mismo eje y en ambos? Siento que es un enfoque más directo, y se logra fácilmente en el ejemplo anterior al agregar scale_y_continuous(limits = c(0, 10000)) al p1.

2) ¿La funcionalidad proporcionada por facet_wrap no es adecuada aquí? Es difícil saber cuál es su estructura de datos es en realidad similar, pero aquí hay un ejemplo de juguete de la forma en que lo haría esto:

library(ggplot2) 

# Maybe your dataset is like this 
x <- data.frame(x = c(1, 2), 
       y1 = c(0, 1000), 
       y2 = c(0, 10000)) 

# Molten data makes a lot of things easier in ggplot 
x.melt <- melt(x, id.var = "x", measure.var = c("y1", "y2")) 

# Plot it - one page, two facets, identical axes (though you could change them), 
# one legend 
ggplot(x.melt, aes(x = x, y = value, color = x)) + 
    geom_line() + 
    facet_wrap(~ variable, nrow = 2) 
+3

Aceptar facetas parece una mejor opción para el ejemplo dado. También puede agregar 'scales =" free_y "' si el OP insiste en que las escalas del eje y se realicen de forma independiente. – joran

+0

Gracias @joran - no recuerdo cómo hacerlo. –

+2

agregando espacios en la etiqueta que funcionan solo en el resultado de are. Una vez que lo ejecuté a través de tikzdevice, los espacios se ignoran. – apepper

10

una forma más limpia de hacer lo mismo pero de un modo más genérico es el uso de la formateador arg:

p1 <- ggplot(data1) + 
    aes(x=x, y=y, colour=x) + 
    geom_line() + 
    scale_y_continuous(formatter = function(x) format(x, width = 5)) 

hacer lo mismo para la segunda trama y asegúrese de establecer la anchura> = el mayor número posible esperas a través de ambas parcelas.

+5

En mi versión de ggplot2, el argumento era "[labels] (http://docs.ggplot2.org/current/scale_continuous.html)" y no "formateador". – simlmx

7

1. Usando cowplot paquete:

library(cowplot) 
plot_grid(p1, p2, ncol=1, align="v") 

enter image description here


2. Usando tracks de ggbio paquete:

Nota: Parece que hay un error, x ticks no se alinean. (probado el 17/03/2016, ggbio_1.18.5)

library(ggbio) 
tracks(data1=p1,data2=p2) 

enter image description here

0

La solución en ggbio para su problema es fijar las coordenadas del eje x de las parcelas originales de la siguiente manera:

library(ggbio) 
p1 <- f() 
fixed(p1) <- TRUE 
p2 <- f() 
fixed(p2) <- TRUE 
tracks(p1,p2) 

mejor,

Yatrosin

Cuestiones relacionadas