Los peligros de alinear parcelas en ggplot
ggplot2 alignment (1)
PREGUNTA
¿Cómo se combinan parcelas separadas (ggplot2), con diferentes ejes y y diferentes alturas de parcela, pero se mantiene la alineación?
DETALLE
Al combinar gráficos con grid.arrange
( grid.arrange
), con diferentes unidades del eje y, no se alinean. Una forma de evitar esto es usar gtable
( gtable
), pero no puedo ajustar la altura relativa de las parcelas.
EJEMPLO
require(ggplot2)
#Make two plots, with different y axis
x = c(1, 5)
y= c(.1, .4)
data1<-data.frame(x,y)
top<-
ggplot(data1, aes(x=x, y=y))+
geom_line()
x = c(1, 5)
y= c(100000, 400000)
data2<-data.frame(x,y)
bottom<-
ggplot(data2, aes(x=x, y=y))+
geom_line()
# Method 1 - Grid Extra
require(gridExtra)
grid.arrange(top, bottom, heights=c(.6,.3))
El método 1 da como resultado esta gráfica, que está desalineada debido a las diferentes etiquetas de longitud y eje:
#Method 2 - gtable
require(gtable)
#Extract Grobs
g1<-ggplotGrob(top)
g2<-ggplotGrob(bottom)
#Bind the tables
g<-gtable:::rbind_gtable(g1, g2, "first")
#Remove a row between the plots
g <- gtable_add_rows(g, unit(-1,"cm"), pos=nrow(g1))
#draw
grid.newpage()
grid.draw(g)
El método 2 produce gráficos alineados, pero no puedo ajustar la altura de cada gráfico.
¡GRACIAS!
En su gtable g
, puede establecer las alturas relativas del panel,
require(gtable)
g1<-ggplotGrob(top)
g2<-ggplotGrob(bottom)
g<-gtable:::rbind_gtable(g1, g2, "first")
panels <- g$layout$t[grep("panel", g$layout$name)]
g$heights[panels] <- unit(c(1,2), "null")
grid.newpage()
grid.draw(g)