Tengo dos ggplots con los que alineo horizontalmente grid.arrange
. He revisado muchas publicaciones en el foro, pero todo lo que intento parece ser comandos que ahora se actualizan y nombran algo más.
Mis datos se ven así;
# Data plot 1
axis1 axis2
group1 -0.212201 0.358867
group2 -0.279756 -0.126194
group3 0.186860 -0.203273
group4 0.417117 -0.002592
group1 -0.212201 0.358867
group2 -0.279756 -0.126194
group3 0.186860 -0.203273
group4 0.186860 -0.203273
# Data plot 2
axis1 axis2
group1 0.211826 -0.306214
group2 -0.072626 0.104988
group3 -0.072626 0.104988
group4 -0.072626 0.104988
group1 0.211826 -0.306214
group2 -0.072626 0.104988
group3 -0.072626 0.104988
group4 -0.072626 0.104988
#And I run this:
library(ggplot2)
library(gridExtra)
groups=c('group1','group2','group3','group4','group1','group2','group3','group4')
x1=data1[,1]
y1=data1[,2]
x2=data2[,1]
y2=data2[,2]
p1=ggplot(data1, aes(x=x1, y=y1,colour=groups)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8)
p2=ggplot(data2, aes(x=x2, y=y2,colour=groups)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8)
#Combine plots
p3=grid.arrange(
p1 + theme(legend.position="none"), p2+ theme(legend.position="none"), nrow=1, widths = unit(c(10.,10), "cm"), heights = unit(rep(8, 1), "cm")))
¿Cómo extraería la leyenda de cualquiera de estas parcelas y la agregaría al fondo / centro de la parcela combinada?
Respuestas:
Actualización 2015-feb
Ver la respuesta de Steven a continuación
Aquí está la trama resultante:
fuente
arrangeGrob()
. También debe invertir las alturas (es decirheights=c(1,10)
También puede usar ggarrange del paquete ggpubr y establecer "common.legend = TRUE":
fuente
print(ggarrangeobject)
uno de misggarrange
objetos cuando necesitaba que fuera trazado por alguna otra función, que puede ser similar a la solución para ustedrenderPlot()
.common.legend = TRUE
es todo lo que necesito!La respuesta de Roland necesita una actualización. Ver: https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs
Este método se ha actualizado para ggplot2 v1.0.0.
Tenga en cuenta la falta de
ggplot_gtable
yggplot_build
.ggplotGrob
se usa en su lugar. Este ejemplo es un poco más complicado que la solución anterior, pero todavía lo resolvió para mí.fuente
grid_arrange_shared_legend
? ¡Gracias!ncol = 1
?Una solución nueva y atractiva es usar
patchwork
. La sintaxis es muy simple:Creado el 13/12/2019 por el paquete reprex (v0.2.1)
fuente
combined <- p1 + p2 + plot_layout(guides = "collect") & theme(legend.position = "bottom")
Sugiero usar cowplot. De su viñeta R :
fuente
annotate_figure(ggarrange())
, usando un legend_b (). ¡Muchas gracias, que Dios te bendiga!@Giuseppe, puede considerar esto para una especificación flexible de la disposición de las parcelas (modificada desde aquí ):
Argumentos adicionales
nrow
yncol
controlar el diseño de las parcelas organizadas:fuente
Si está trazando las mismas variables en ambas parcelas, la forma más simple sería combinar los marcos de datos en uno y luego usar facet_wrap.
Por su ejemplo:
Otro ejemplo usando el conjunto de datos de diamantes. Esto muestra que incluso puede hacerlo funcionar si solo tiene una variable común entre sus parcelas.
Lo único complicado con el segundo ejemplo es que las variables de factor se convierten en numéricas cuando se combina todo en un marco de datos. Idealmente, lo hará principalmente cuando todas sus variables de interés sean del mismo tipo.
fuente
@Guiseppe:
No tengo ni idea de Grobs, etc., pero heckeé una solución para dos parcelas, debería ser posible extenderla a un número arbitrario, pero no es una función atractiva:
fuente
Si la leyenda es la misma para ambas parcelas, hay una solución simple usando
grid.arrange
(suponiendo que desee que su leyenda se alinee con ambas parcelas, ya sea vertical u horizontalmente). Simplemente mantenga la leyenda para la trama del extremo inferior o del extremo derecho mientras omite la leyenda para el otro. Sin embargo, agregar una leyenda a un solo diagrama altera el tamaño de un diagrama en relación con el otro. Para evitar esto, use elheights
comando para ajustarlos manualmente y mantenerlos del mismo tamaño. Incluso puede usargrid.arrange
para hacer títulos de eje comunes. Tenga en cuenta que esto requerirálibrary(grid)
además delibrary(gridExtra)
. Para parcelas verticales:y_title <- expression(paste(italic("E. coli"), " (CFU/100mL)"))
grid.arrange(arrangeGrob(p1, theme(legend.position="none"), ncol=1), arrangeGrob(p2, theme(legend.position="bottom"), ncol=1), heights=c(1,1.2), left=textGrob(y_title, rot=90, gp=gpar(fontsize=20)))
Aquí está el resultado de un gráfico similar para un proyecto en el que estaba trabajando:
fuente