manipulation - Alineación de arriba a abajo de dos figuras ggplot2
ggtitle size (3)
Aquí hay un ejemplo:
m <- matrix(c(3, 1, 0, 2), 2, byrow = T)
lay <- gglayout(m, widths = c(1, 3), heights = c(3, 1))
ggtable(p1, p2, p3, layout = lay)
puedes usar esto por
install.packages(''devtools'')
library(devtools)
dev_mode()
install_github("ggplot2", "kohske", "cutting-edge")
library(ggplot2)
tenga en cuenta que esta rama es experimental, por lo que tal vez haya errores.
Me doy cuenta de que la función ggExtra
paquete ggExtra
ha sido desaprobada y eliminada. Sin embargo, estoy usando mi propia versión ya que parece proporcionar la funcionalidad específica que necesito. He examinado facetas para resolver mi problema, pero no creo que funcione para mi problema en particular. Lo que parece ser el problema es que las imágenes de arriba a abajo no se alinean cuando uso coord_equal
en una de ellas. Sin embargo, esto no parece afectar de izquierda a derecha. Aquí hay una versión simplificada (o al menos tan simple como puedo) de lo que intento lograr.
Crea algunos cuadros de datos ficticios:
source(''https://raw.github.com/jbryer/multilevelPSA/master/r/align.R'')
require(psych)
df = data.frame(x=rnorm(100, mean=50, sd=10),
y=rnorm(100, mean=48, sd=10),
group=rep(letters[1:10], 10))
dfx = describe.by(df$x, df$group, mat=TRUE)[,c(''group1'', ''mean'', ''n'', ''min'', ''max'')]
names(dfx) = c(''group'', ''x'', ''x.n'', ''x.min'', ''x.max'')
dfy = describe.by(df$y, df$group, mat=TRUE)[,c(''group1'', ''mean'', ''n'', ''min'', ''max'')]
names(dfy) = c(''group'', ''y'', ''y.n'', ''y.min'', ''y.max'')
df2 = cbind(dfx, dfy[,2:ncol(dfy)])
range = c(0,100)
Esto configurará las tres parcelas:
p1a = ggplot(df2, aes(x=x, y=y, colour=group)) + geom_point() +
opts(legend.position=''none'') +
scale_x_continuous(limits=range) + scale_y_continuous(limits=range)
p1 = p1a + coord_equal(ratio=1)
p2 = ggplot(df, aes(x=x, y=group, colour=group)) + geom_point() +
scale_x_continuous(limits=range) + opts(legend.position=''none'')
p3 = ggplot(df, aes(x=group, y=y, colour=group)) + geom_point() +
scale_y_continuous(limits=range) + opts(legend.position=''none'')
La alineación de arriba a abajo no funciona con coord_equal
grid_layout <- grid.layout(nrow=2, ncol=2, widths=c(1,2), heights=c(2,1))
grid.newpage()
pushViewport( viewport( layout=grid_layout, width=1, height=1 ) )
align.plots(grid_layout, list(p1, 1, 2), list(p3, 1, 1), list(p2, 2, 2))
Broken Plot http://bryer.org/alignplots1.png
La solución es agregar respect=TRUE
a la llamada grid.layout
:
grid_layout <- grid.layout(nrow=2, ncol=2, widths=c(1,2), heights=c(2,1), respect=TRUE)
Pero si no uso coord_equal la alineación funciona bien:
grid_layout <- grid.layout(nrow=2, ncol=2, widths=c(1,2), heights=c(2,1))
grid.newpage()
pushViewport( viewport( layout=grid_layout, width=1, height=1 ) )
align.plots(grid_layout, list(p1a, 1, 2), list(p3, 1, 1), list(p2, 2, 2))
Para resolver el problema utilizando el método align.plots, especifique respect=TRUE
en la llamada de diseño:
grid_layout <- grid.layout(nrow=2, ncol=2, widths=c(1,2), heights=c(2,1), respect=TRUE)
ggplot2 ahora tiene ggplotGrob()
, que puede ayudar con esto.
Primero, necesitamos actualizar el código usado para generar las parcelas:
p1a = ggplot(df2, aes(x=x, y=y, colour=group)) + geom_point() +
scale_x_continuous(limits=range) + scale_y_continuous(limits=range)
p1 = p1a + coord_equal(ratio=1) + theme_minimal() + theme(legend.position=''none'')
p2 = ggplot(df, aes(x=x, y=group, colour=group)) + geom_point() +
scale_x_continuous(limits=range) + theme_minimal() + theme(legend.position=''none'')
p3 = ggplot(df, aes(x=group, y=y, colour=group)) + geom_point() +
scale_y_continuous(limits=range) + theme_minimal() + theme(legend.position=''none'')
p4 <- ggplot(df, aes(x = group, y = y)) +
geom_blank() +
theme(line = element_blank(),
rect = element_blank(),
text = element_blank(),
title = element_blank())
p4 estará en blanco; solo necesitamos que grob dibuje.
Luego cargamos el paquete de grillas y dibujamos los grobs en una lista ordenada en filas y columnas usando cbind()
y rbind()
.
library(grid)
grid.newpage()
grid.draw(
cbind(
rbind(ggplotGrob(p3), ggplotGrob(p4), size = "first"),
rbind(ggplotGrob(p1), ggplotGrob(p2), size = "first"),
size = "first"))
No estoy seguro de si este método le permitirá trazar p3 en un ancho diferente y p2 en una altura diferente, como los tiene en el ejemplo original; Normalmente necesito una grilla de gráficos del mismo tamaño, y no he tenido que averiguar diferentes tamaños.
Esta respuesta se basa en parte parcialmente en https://.com/a/17463184/393354