Ich möchte zwei Diagramme mit dem Paket ggplot2 nebeneinander platzieren , dh das Äquivalent von par(mfrow=c(1,2))
.
Zum Beispiel möchte ich, dass die folgenden zwei Diagramme nebeneinander mit demselben Maßstab angezeigt werden.
x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)
Muss ich sie in denselben data.frame einfügen?
qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
r
visualization
ggplot2
Christopher DuBois
quelle
quelle
Antworten:
Alle ggplots nebeneinander (oder n Plots in einem Raster)
Die Funktion
grid.arrange()
imgridExtra
Paket kombiniert mehrere Diagramme. So setzen Sie zwei nebeneinander.Dies ist nützlich, wenn die beiden Diagramme nicht auf denselben Daten basieren, z. B. wenn Sie verschiedene Variablen ohne Verwendung von reshape () zeichnen möchten.
Dadurch wird die Ausgabe als Nebeneffekt dargestellt. Um die Nebenwirkung in eine Datei zu drucken, spezifizieren einen Gerätetreiber (wie
pdf
,png
usw.), zBoder
arrangeGrob()
in Kombination mit verwendenggsave()
,Dies entspricht der Erstellung von zwei unterschiedlichen Plots mit
par(mfrow = c(1,2))
. Dies spart nicht nur Zeit beim Anordnen von Daten, sondern ist auch erforderlich, wenn Sie zwei unterschiedliche Diagramme wünschen.Anhang: Verwenden von Facetten
Facetten sind hilfreich, um ähnliche Diagramme für verschiedene Gruppen zu erstellen. Dies wird unten in vielen Antworten unten ausgeführt, aber ich möchte diesen Ansatz mit Beispielen hervorheben, die den obigen Darstellungen entsprechen.
Aktualisieren
Die
plot_grid
Funktion in dercowplot
ist es wert, als Alternative zu überprüft zu werdengrid.arrange
. Siehe die Antwort von @ claus-wilke unten und diese Vignette für einen äquivalenten Ansatz; Die Funktion ermöglicht jedoch feinere Steuerelemente für die Position und Größe des Plots, basierend auf dieser Vignette .quelle
?grid.arrange
lässt mich denken, dass diese Funktion jetzt arrangGrob heißt. Ich konnte tun, was ich wollte, indem ich es tata <- arrangeGrob(p1, p2)
und dannprint(a)
.grid.arrange
ist immer noch eine gültige, nicht veraltete Funktion. Haben Sie versucht, die Funktion zu verwenden? Was passiert, wenn nicht das, was Sie erwartet haben?Ein Nachteil der darauf basierenden Lösungen
grid.arrange
besteht darin, dass sie es schwierig machen, die Diagramme mit Buchstaben (A, B usw.) zu kennzeichnen, wie es die meisten Zeitschriften erfordern.Ich habe das Cowplot- Paket geschrieben, um dieses (und einige andere) Probleme zu lösen, insbesondere die Funktion
plot_grid()
:Das zurückgegebene Objekt
plot_grid()
ist ein anderes ggplot2-Objekt, und Sie können esggsave()
wie gewohnt speichern :Alternativ können Sie die Cowplot-Funktion verwenden
save_plot()
, bei der es sich um eine dünne Hülle handeltggsave()
, mit der Sie auf einfache Weise die richtigen Abmessungen für kombinierte Plots ermitteln können, z.(Das
ncol = 2
Argument besagt,save_plot()
dass zwei Diagramme nebeneinander liegen undsave_plot()
das gespeicherte Bild doppelt so breit ist.)Eine ausführlichere Beschreibung zum Anordnen von Plots in einem Raster finden Sie in dieser Vignette. Es gibt auch eine Vignette, in der erklärt wird, wie Plots mit einer gemeinsamen Legende erstellt werden.
Ein häufiger Punkt der Verwirrung ist, dass das Cowplot-Paket das Standardthema ggplot2 ändert. Das Paket verhält sich so, weil es ursprünglich für interne Laborzwecke geschrieben wurde und wir niemals das Standarddesign verwenden. Wenn dies zu Problemen führt, können Sie einen der folgenden drei Ansätze verwenden, um diese zu umgehen:
1. Stellen Sie das Thema für jedes Diagramm manuell ein. Ich denke, es ist eine gute Praxis, immer ein bestimmtes Thema für jede Handlung anzugeben, so wie ich es
+ theme_bw()
im obigen Beispiel getan habe . Wenn Sie ein bestimmtes Thema angeben, spielt das Standardthema keine Rolle.2. Setzen Sie das Standarddesign wieder auf das Standarddesign von ggplot2 zurück. Sie können dies mit einer Codezeile tun:
3. Rufen Sie die Cowplot-Funktionen auf, ohne das Paket anzuhängen. Sie können Cowplot-Funktionen auch nicht
library(cowplot)
oderrequire(cowplot)
vorab aufrufen, indem Sie sie voranstellencowplot::
. Das obige Beispiel mit dem Standardthema ggplot2 würde beispielsweise wie folgt lauten:Aktualisierung:
quelle
Sie können die folgende
multiplot
Funktion aus Winston Changs R-Kochbuch verwendenquelle
Mit dem Patchwork- Paket können Sie einfach den
+
Operator verwenden:quelle
Ja, Sie müssen Ihre Daten entsprechend anordnen. Ein Weg wäre folgender:
Ich bin mir sicher, dass es bessere Tricks bei Plyr oder Reshape gibt - ich bin immer noch nicht wirklich auf dem neuesten Stand bei all diesen leistungsstarken Paketen von Hadley.
quelle
Mit dem Umformungspaket können Sie so etwas tun.
quelle
Es gibt auch ein Multipanelfigure-Paket , das es wert ist, erwähnt zu werden. Siehe auch diese Antwort .
Erstellt am 06.07.2018 durch das reprex-Paket (v0.2.0.9000).
quelle
ggplot2 basiert auf Rastergrafiken, die ein anderes System zum Anordnen von Plots auf einer Seite bieten. Der
par(mfrow...)
Befehl hat keine direkte Entsprechung, da Rasterobjekte ( Grobs genannt ) nicht unbedingt sofort gezeichnet werden, sondern als reguläre R-Objekte gespeichert und bearbeitet werden können, bevor sie in eine grafische Ausgabe konvertiert werden. Dies ermöglicht eine größere Flexibilität als die Auslosung Modells von Basisgrafiken, aber die Strategie ist notwendigerweise etwas anders.Ich habe geschrieben
grid.arrange()
, um eine einfache Schnittstelle so nah wie möglich zu bietenpar(mfrow)
. In seiner einfachsten Form würde der Code folgendermaßen aussehen:Weitere Optionen finden Sie in dieser Vignette .
Eine häufige Beschwerde ist, dass Diagramme nicht unbedingt ausgerichtet sind, z. B. wenn sie Achsenbeschriftungen unterschiedlicher Größe haben. Dies ist jedoch beabsichtigt:
grid.arrange
beabsichtigt wird kein Versuch unternommen, ggplot2-Objekte in Sonderfällen zu erstellen, und sie werden auch für andere Grobs (z. B. Gitterdiagramme) gleich behandelt ). Es werden lediglich Grobs in einem rechteckigen Layout platziert.Für den Sonderfall von ggplot2-Objekten habe ich eine andere Funktion
ggarrange
mit einer ähnlichen Oberfläche geschrieben, die versucht, Plotfelder (einschließlich facettierter Plots) auszurichten und die Seitenverhältnisse zu berücksichtigen, wenn sie vom Benutzer definiert werden.Beide Funktionen sind kompatibel mit
ggsave()
. Für einen allgemeinen Überblick über die verschiedenen Optionen und einige historische Zusammenhänge bietet diese Vignette zusätzliche Informationen .quelle
Update: Diese Antwort ist sehr alt.
gridExtra::grid.arrange()
ist jetzt der empfohlene Ansatz. Ich lasse dies hier, falls es nützlich sein könnte.Stephen Turner hat die
arrange()
Funktion im Blog Getting Genetics Done veröffentlicht (Anweisungen zur Anwendung finden Sie im Beitrag).quelle
grid.arrange
(ich wünschte, ich hätte sie zu diesem Zeitpunkt nicht auf Mailinglisten veröffentlicht - es gibt keine Möglichkeit, diese Online-Ressourcen zu aktualisieren). Die verpackte Version ist eine bessere Wahl, wenn Sie mich fragenVerwenden von
tidyverse
:quelle
Die obigen Lösungen sind möglicherweise nicht effizient, wenn Sie mehrere ggplot-Diagramme mit einer Schleife zeichnen möchten (z. B. wie hier gefragt: Erstellen mehrerer Diagramme in ggplot mit unterschiedlichen Y-Achsenwerten mithilfe einer Schleife ). Dies ist ein gewünschter Schritt bei der Analyse des Unbekannten ( oder große) Datensätze (z. B. wenn Sie die Anzahl aller Variablen in einem Datensatz zeichnen möchten).
Der folgende Code zeigt, wie dies mit dem oben genannten 'multiplot ()' gemacht wird, dessen Quelle hier angegeben ist: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) :
Führen Sie nun die Funktion aus, um die Anzahl der mit ggplot gedruckten Variablen auf einer Seite abzurufen
Eine Sache , die Sie beachten sollten, ist folgende: Wenn Sie im obigen Code anstelle von
verwenden
aes(get(strX))
, was Sie normalerweise in Schleifen verwenden würdenggplot
,aes_string(strX)
werden die gewünschten Diagramme NICHT gezeichnet. Stattdessen wird der letzte Plot viele Male geplottet. Ich habe nicht herausgefunden warum - es muss vielleicht das tunaes
undaes_string
wird gerufenggplot
.Ansonsten hoffe ich, dass Sie die Funktion nützlich finden.
quelle
plots
Objekte wachsen ,for-loop
die sehr ineffizient sind und in denen nicht empfohlen wirdR
. Bitte beachten Sie diese großen Beiträge , um herauszufinden , bessere Möglichkeiten , es zu tun: Effiziente Akkumulation in R , Anwenden einer Funktion über Zeilen eines Datenrahmens & Row orientierte Workflows in R mit der tidyversetidy evaluation
Ansatzes, der seitggplot2 v.3.0.0
stackoverflow.com/a/52045613/786542Nach meiner Erfahrung funktioniert gridExtra: grid.arrange perfekt, wenn Sie versuchen, Diagramme in einer Schleife zu generieren.
Funktionscode-Snippet:
quelle
Das
cowplot
Paket bietet Ihnen eine gute Möglichkeit, dies auf eine Weise zu tun, die zur Veröffentlichung passt.quelle