scale_x_discrete manually manipulation ggtitle ggplot change r ggplot2 gridextra gtable

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")