r - manually - ggtitle
alineado a la izquierda dos bordes del gráfico(ggplot) (7)
Estoy usando ggplot y tengo dos gráficos que quiero mostrar uno encima del otro. Utilicé grid.arrange
de gridExtra para apilarlos. El problema es que quiero que los bordes izquierdos de los gráficos se alineen, así como los bordes derechos, independientemente de las etiquetas de los ejes. (El problema surge porque las etiquetas de un gráfico son cortas mientras que el otro es largo).
La pregunta:
¿Cómo puedo hacer esto? No estoy casado con grid.arrange pero el ggplot2 es obligatorio.
Lo que he intentado:
Intenté jugar con anchuras y alturas, así como ncol y nrow para hacer una cuadrícula de 2 x 2 y colocar las imágenes en esquinas opuestas y luego jugar con los anchos, pero no pude obtener las imágenes en las esquinas opuestas.
require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip()
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip()
grid.arrange(A, B, ncol=1)
Aquí hay otra posible solución que utiliza melt
del paquete facet_wrap
y facet_wrap
:
library(ggplot2)
library(reshape2)
dat = CO2[, c(1, 2)]
dat$id = seq(nrow(dat))
mdat = melt(dat, id.vars="id")
head(mdat)
# id variable value
# 1 1 Plant Qn1
# 2 2 Plant Qn1
# 3 3 Plant Qn1
# 4 4 Plant Qn1
# 5 5 Plant Qn1
# 6 6 Plant Qn1
plot_1 = ggplot(mdat, aes(x=value)) +
geom_bar() +
coord_flip() +
facet_wrap(~ variable, nrow=2, scales="free", drop=TRUE)
ggsave(plot=plot_1, filename="plot_1.png", height=4, width=6)
El paquete de egg
envuelve los objetos ggplot en una tabla estándar de 3x3
, lo que permite la alineación de los paneles de trazado entre ggplots arbitrarios, incluidos los facetados.
library(egg) # devtools::install_github(''baptiste/egg'')
library(ggplot2)
p1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
geom_point()
p2 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
geom_point() + facet_wrap( ~ cyl, ncol=2, scales = "free") +
guides(colour="none") +
theme()
ggarrange(p1, p2)
En http://rpubs.com/MarkusLoew/13295 es una solución realmente fácil disponible (último elemento) Aplicado a este problema:
require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip()
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip()
grid.draw(rbind(ggplotGrob(A), ggplotGrob(B), size="first"))
también puedes usar esto para ancho y alto:
require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip()
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip()
C <- ggplot(CO2, aes(x=conc)) + geom_bar() +coord_flip()
D <- ggplot(CO2, aes(x=uptake)) + geom_bar() +coord_flip()
grid.draw(cbind(
rbind(ggplotGrob(A), ggplotGrob(B), size="first"),
rbind(ggplotGrob(C), ggplotGrob(D), size="first"),
size=''first''))
En el mejor de los casos, esto es un truco:
library(wq)
layOut(list(A, 1, 2:16), list(B, 2:3, 1:16))
Sin embargo, se siente realmente mal.
Prueba esto,
gA <- ggplotGrob(A)
gB <- ggplotGrob(B)
maxWidth = grid::unit.pmax(gA$widths[2:5], gB$widths[2:5])
gA$widths[2:5] <- as.list(maxWidth)
gB$widths[2:5] <- as.list(maxWidth)
grid.arrange(gA, gB, ncol=1)
Editar
Aquí hay una solución más general (funciona con cualquier cantidad de parcelas) usando una versión modificada de rbind.gtable
incluida en gridExtra
gA <- ggplotGrob(A)
gB <- ggplotGrob(B)
grid::grid.newpage()
grid::grid.draw(rbind(gA, gB))
Quería generalizar esto para cualquier cantidad de tramas. Aquí hay una solución paso a paso que utiliza el enfoque de Baptiste:
plots <- list(A, B, C, D)
grobs <- list()
widths <- list()
recolectar los anchos para cada grob de cada parcela
for (i in 1:length(plots)){
grobs[[i]] <- ggplotGrob(plots[[i]])
widths[[i]] <- grobs[[i]]$widths[2:5]
}
use do.call para obtener el ancho máximo
maxwidth <- do.call(grid::unit.pmax, widths)
asignar el ancho máximo a cada grob
for (i in 1:length(grobs)){
grobs[[i]]$widths[2:5] <- as.list(maxwidth)
}
trama
do.call("grid.arrange", c(grobs, ncol = 1))
Usando el paquete cowplot :
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip()
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip()
library(cowplot)
plot_grid(A, B, ncol=1, align="v")