Ich habe zwei ggplots, mit denen ich horizontal ausrichte grid.arrange
. Ich habe viele Forenbeiträge durchgesehen, aber alles, was ich versuche, scheinen Befehle zu sein, die jetzt aktualisiert und etwas anderes benannt werden.
Meine Daten sehen so aus;
# 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")))
Wie würde ich die Legende aus einem dieser Diagramme extrahieren und sie unten / in der Mitte des kombinierten Diagramms hinzufügen?
Antworten:
Update 2015-Feb
Siehe Stevens Antwort unten
Hier ist die resultierende Handlung:
quelle
arrangeGrob()
. Sie müssen auch die Höhen umkehren (dhheights=c(1,10)
Sie können auch ggarrange aus dem ggpubr- Paket verwenden und "common.legend = TRUE" setzen:
quelle
print(ggarrangeobject)
eines meinerggarrange
Objekte umwickeln, wenn es von einer anderen Funktion geplottet werden musste, die möglicherweise der Lösung für Ihr Objekt ähneltrenderPlot()
.common.legend = TRUE
ist alles was ich brauche!Rolands Antwort muss aktualisiert werden. Siehe: https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs
Diese Methode wurde für ggplot2 v1.0.0 aktualisiert.
Beachten Sie das Fehlen von
ggplot_gtable
undggplot_build
.ggplotGrob
wird stattdessen verwendet. Dieses Beispiel ist etwas komplizierter als die obige Lösung, aber es hat es trotzdem für mich gelöst.quelle
grid_arrange_shared_legend
? Danke dir!ncol = 1
?Eine neue, attraktive Lösung ist die Verwendung
patchwork
. Die Syntax ist sehr einfach:Erstellt am 2019-12-13 durch das reprex-Paket (v0.2.1)
quelle
combined <- p1 + p2 + plot_layout(guides = "collect") & theme(legend.position = "bottom")
Ich schlage vor, Cowplot zu verwenden. Aus ihrer R-Vignette :
quelle
annotate_figure(ggarrange())
legend_b () in meine Handlung aufzunehmen. Vielen Dank, Gott segne dich!@Giuseppe, vielleicht möchten Sie dies für eine flexible Spezifikation der Plotanordnung berücksichtigen (von hier aus modifiziert ):
Zusätzliche Argumente
nrow
undncol
steuern das Layout der angeordneten Diagramme:quelle
Wenn Sie in beiden Plots dieselben Variablen zeichnen, besteht der einfachste Weg darin, die Datenrahmen zu einem zu kombinieren und dann facet_wrap zu verwenden.
Für Ihr Beispiel:
Ein weiteres Beispiel mit dem Diamanten-Datensatz. Dies zeigt, dass Sie es sogar zum Laufen bringen können, wenn Sie nur eine Variable in Ihren Plots haben.
Das einzig schwierige am zweiten Beispiel ist, dass die Faktorvariablen zu numerisch gezwungen werden, wenn Sie alles in einem Datenrahmen kombinieren. Idealerweise tun Sie dies hauptsächlich, wenn alle Ihre interessierenden Variablen vom gleichen Typ sind.
quelle
@ Guiseppe:
Ich habe überhaupt keine Ahnung von Grobs usw., aber ich habe eine Lösung für zwei Handlungen zusammen gehackt, die sich auf eine beliebige Zahl ausweiten lassen sollte, aber keine sexy Funktion hat:
quelle
Wenn die Legende für beide Diagramme gleich ist, gibt es eine einfache Lösung
grid.arrange
(vorausgesetzt, Sie möchten, dass Ihre Legende entweder vertikal oder horizontal an beiden Diagrammen ausgerichtet wird). Behalten Sie einfach die Legende für die Handlung ganz unten oder ganz rechts bei, während Sie die Legende für die andere weglassen. Durch Hinzufügen einer Legende zu nur einem Plot wird jedoch die Größe eines Plots relativ zum anderen geändert. Um dies zu vermeiden, verwenden Sie denheights
Befehl, um sie manuell anzupassen und die gleiche Größe beizubehalten. Sie können sogargrid.arrange
allgemeine Achsentitel erstellen. Beachten Sie, dass dieslibrary(grid)
zusätzlich erforderlich istlibrary(gridExtra)
. Für vertikale Diagramme: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)))
Hier ist das Ergebnis für ein ähnliches Diagramm für ein Projekt, an dem ich gearbeitet habe:
quelle