Esta pregunta está motivada por explorar más a fondo este question. El problema con la solución aceptada se vuelve más obvio cuando hay una mayor disparidad en el número de barras por faceta. Echar un vistazo a estos datos y la trama resultante utilizando esa solución:ggplot2 + gridExtra: cómo asegurar geom_bar en diferentes tamaños grobs de la gráfica resultado en la misma barra de ancho
# create slightly contrived data to better highlight width problems
data <- data.frame(ID=factor(c(rep(1,9), rep(2,6), rep(3,6), rep(4,3), rep(5,3))),
TYPE=factor(rep(1:3,length(ID)/3)),
TIME=factor(c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,1,1,1)),
VAL=runif(27))
# implement previously suggested solution
base.width <- 0.9
data$w <- base.width
# facet two has 3 bars compared to facet one's 5 bars
data$w[data$TIME==2] <- base.width * 3/5
# facet 3 has 1 bar compared to facet one's 5 bars
data$w[data$TIME==3] <- base.width * 1/5
ggplot(data, aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~TIME, ncol=1, scale="free") +
geom_bar(position="stack", aes(width = w),stat = "identity") +
coord_flip()
Se dará cuenta de los anchos se ven exactamente la derecha, pero el espacio en blanco en la faceta 3 es bastante evidente. No hay una manera fácil de solucionar esto en ggplot2 que he visto aún (facet_wrap no tiene una opción space
).
El siguiente paso es tratar de solucionar esto usando gridExtra:
# create each of the three plots, don't worry about legend for now
p1 <- ggplot(data[data$TIME==1,], aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack", show_guide=FALSE) +
coord_flip()
p2 <- ggplot(data[data$TIME==2,], aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack", show_guide=FALSE) +
coord_flip()
p3 <- ggplot(data[data$TIME==3,], aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack", show_guide=FALSE) +
coord_flip()
# use similar arithmetic to try and get layout correct
require(gridExtra)
heights <- c(5, 3, 1)/sum(5, 3, 1)
print(arrangeGrob(p1 ,p2, p3, ncol=1,
heights=heights))
Se dará cuenta utilicé la misma aritmética sugerido previamente basa fuera el número de barras por las facetas, pero en este caso acabe horriblemente mal Esto parece ser porque hay elementos adicionales de "altura constante" que debo tener en cuenta en las matemáticas.
Otra complicación (creo) es que el resultado final (y si el ancho coincide o no) también dependerá del ancho y alto de donde estoy obteniendo el grob final, ya sea en un R/RStudio entorno, o a un archivo PNG.
¿Cómo puedo lograr esto?
con 'ggplot_build' podría modificar directamente la altura de cada panel en su primera solución. kohske ha publicado ejemplos aquí – baptiste
@baptiste gracias, eche un vistazo y actualice la pregunta pronto –