Eu tenho dois ggplots com os quais alinhar horizontalmente grid.arrange
. Examinei várias postagens no fórum, mas tudo o que tento parece ser comandos que agora são atualizados e têm outro nome.
Meus dados são assim;
# 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")))
Como extrairia a legenda de qualquer um desses gráficos e a adicionaria ao final / centro do gráfico combinado?
Respostas:
Atualização 2015-fev
Veja a resposta de Steven abaixo
Aqui está o gráfico resultante:
fonte
arrangeGrob()
. Você também precisa inverter as alturas (ieheights=c(1,10)
Você também pode usar o ggarrange do pacote ggpubr e definir "common.legend = TRUE":
fonte
print(ggarrangeobject)
um dos meusggarrange
objetos quando precisava que ele fosse plotado por alguma outra função, que pode ser semelhante à solução para o seurenderPlot()
?common.legend = TRUE
é tudo o que eu preciso!A resposta de Roland precisa ser atualizada. Consulte: https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs
Este método foi atualizado para o ggplot2 v1.0.0.
Observe a falta de
ggplot_gtable
eggplot_build
.ggplotGrob
é usado em seu lugar. Este exemplo é um pouco mais complicado do que a solução acima, mas ainda o resolveu para mim.fonte
grid_arrange_shared_legend
? Obrigado!ncol = 1
?Uma solução nova e atraente é usar
patchwork
. A sintaxe é muito simples:Criado em 2019-12-13 pelo pacote reprex (v0.2.1)
fonte
combined <- p1 + p2 + plot_layout(guides = "collect") & theme(legend.position = "bottom")
Eu sugiro usar cowplot. Da vinheta R :
fonte
annotate_figure(ggarrange())
, usando um legend_b (). Muito obrigado, Deus te abençoe!@ Giuseppe, convém considerar isso para uma especificação flexível do arranjo de parcelas (modificado aqui ):
Argumentos extras
nrow
encol
controle o layout dos gráficos organizados:fonte
Se você estiver plotando as mesmas variáveis em ambas as plotagens, a maneira mais simples seria combinar os quadros de dados em um e, em seguida, use facet_wrap.
Para o seu exemplo:
Outro exemplo usando o conjunto de dados de diamantes. Isso mostra que você pode até fazê-lo funcionar se você tiver apenas uma variável comum entre seus gráficos.
A única coisa complicada do segundo exemplo é que as variáveis fatoriais são coagidas a numéricas quando você combina tudo em um quadro de dados. Então, idealmente, você fará isso principalmente quando todas as suas variáveis de interesse forem do mesmo tipo.
fonte
@Guiseppe:
Não tenho a mínima idéia do Grobs etc., mas criei uma solução para duas parcelas, deve ser possível estender para um número arbitrário, mas não em uma função sexy:
fonte
Se a legenda for a mesma para ambas as plotagens, existe uma solução simples usando
grid.arrange
(supondo que você deseje que sua legenda se alinhe com ambas as plotagens, vertical ou horizontalmente). Simplesmente mantenha a legenda da plotagem mais abaixo ou mais à direita, enquanto omite a legenda para a outra. Adicionar uma legenda a apenas um gráfico, no entanto, altera o tamanho de um gráfico em relação ao outro. Para evitar isso, use oheights
comando para ajustar manualmente e mantê-los do mesmo tamanho. Você pode até usargrid.arrange
para criar títulos de eixos comuns. Observe que isso exigirálibrary(grid)
além delibrary(gridExtra)
. Para gráficos verticais: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)))
Aqui está o resultado para um gráfico semelhante para um projeto em que eu estava trabalhando:
fonte