Gibt es eine Möglichkeit, Streudiagramme mit Randhistogrammen zu erstellen, wie in der folgenden Stichprobe in ggplot2
? In Matlab ist es die scatterhist()
Funktion und es gibt auch Äquivalente für R. Ich habe es jedoch nicht für ggplot2 gesehen.
Ich habe einen Versuch gestartet, indem ich die einzelnen Diagramme erstellt habe, weiß aber nicht, wie ich sie richtig anordnen soll.
require(ggplot2)
x<-rnorm(300)
y<-rt(300,df=2)
xy<-data.frame(x,y)
xhist <- qplot(x, geom="histogram") + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 5/16, axis.text.y = theme_blank(), axis.title.y=theme_blank(), background.colour="white")
yhist <- qplot(y, geom="histogram") + coord_flip() + opts(background.fill = "white", background.color ="black")
yhist <- yhist + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 16/5, axis.text.y = theme_blank(), axis.title.y=theme_blank() )
scatter <- qplot(x,y, data=xy) + scale_x_continuous(limits=c(min(x),max(x))) + scale_y_continuous(limits=c(min(y),max(y)))
none <- qplot(x,y, data=xy) + geom_blank()
und deren Anordnung mit der Funktion geschrieben hier . Um es kurz zu machen: Gibt es eine Möglichkeit, diese Grafiken zu erstellen?
Antworten:
Das
gridExtra
Paket sollte hier funktionieren. Beginnen Sie, indem Sie jedes der ggplot-Objekte erstellen:Verwenden Sie dann die Funktion grid.arrange:
quelle
xy <- data.frame(x=rnorm(300), y=rt(300,df=2) )
unddata=xy
in den ggplot-Aufrufen zu verwenden.Dies ist keine vollständig reaktionsschnelle Antwort, aber sehr einfach. Es zeigt eine alternative Methode zur Anzeige von Randdichten und zur Verwendung von Alpha-Levels für grafische Ausgaben, die Transparenz unterstützen:
quelle
Dies mag etwas spät sein, aber ich habe mich dazu entschlossen, ein Paket (
ggExtra
) dafür zu erstellen, da es ein bisschen Code enthält und das Schreiben mühsam sein kann. Das Paket versucht auch, einige häufig auftretende Probleme zu lösen, z. B. sicherzustellen, dass die Diagramme auch dann in einer Linie zueinander stehen, wenn ein Titel vorhanden ist oder der Text vergrößert wird.Die Grundidee ähnelt der Antwort hier, geht aber etwas darüber hinaus. Hier ist ein Beispiel für das Hinzufügen von Randhistogrammen zu einer zufälligen Menge von 1000 Punkten. Hoffentlich erleichtert dies das Hinzufügen von Histogrammen / Dichtediagrammen in der Zukunft.
Link zum ggExtra-Paket
quelle
Eine Ergänzung, nur um etwas Suchzeit für Leute zu sparen, die dies nach uns tun.
Legenden, Achsenbeschriftungen, Achsentexte und Häkchen lassen die Diagramme voneinander abweichen, sodass Ihr Diagramm hässlich und inkonsistent aussieht.
Sie können dies korrigieren, indem Sie einige dieser Themeneinstellungen verwenden.
und Skalen ausrichten,
Die Ergebnisse sehen also in Ordnung aus:
quelle
Nur eine sehr geringfügige Abweichung von BondedDusts Antwort im allgemeinen Sinne marginaler Verteilungsindikatoren.
Edward Tufte hat diese Verwendung von Teppichplots als "Punkt-Strich-Plot" bezeichnet und in VDQI ein Beispiel für die Verwendung der Achsenlinien zur Angabe des Bereichs jeder Variablen angegeben. In meinem Beispiel geben die Achsenbeschriftungen und Gitterlinien auch die Verteilung der Daten an. Die Beschriftungen befinden sich bei den Werten der Fünf-Zahlen-Zusammenfassung von Tukey (Minimum, unteres Scharnier, Median, oberes Scharnier, Maximum) und geben einen schnellen Eindruck von der Streuung jeder Variablen.
Diese fünf Zahlen sind somit eine numerische Darstellung eines Boxplots. Es ist etwas schwierig, da die ungleichmäßig verteilten Gitterlinien darauf hindeuten, dass die Achsen eine nichtlineare Skalierung haben (in diesem Beispiel sind sie linear). Vielleicht ist es am besten, Gitterlinien wegzulassen oder sie an normalen Stellen zu erzwingen und die Beschriftungen nur die Zusammenfassung mit fünf Zahlen anzeigen zu lassen.
quelle
Da es beim Vergleich verschiedener Gruppen keine zufriedenstellende Lösung für diese Art von Handlung gab, schrieb ich eine Funktion , um dies zu tun.
Es funktioniert sowohl für gruppierte als auch für nicht gruppierte Daten und akzeptiert zusätzliche grafische Parameter:
quelle
Ich habe das package (
ggpubr
) gefunden, das für dieses Problem sehr gut zu funktionieren scheint, und es berücksichtigt verschiedene Möglichkeiten, die Daten anzuzeigen.Der Link zum Paket ist hier und in diesem Link finden Sie ein nettes Tutorial, um es zu verwenden. Der Vollständigkeit halber füge ich eines der Beispiele bei, die ich reproduziert habe.
Ich habe das Paket zuerst installiert (es erfordert
devtools
)Für das spezielle Beispiel der Anzeige verschiedener Histogramme für verschiedene Gruppen wird Folgendes erwähnt
ggExtra
: "Eine EinschränkungggExtra
besteht darin, dass nicht mehrere Gruppen im Streudiagramm und in den Randdiagrammen behandelt werden können. Im folgenden R-Code stellen wir a Lösung mit demcowplot
Paket. " In meinem Fall musste ich das letztere Paket installieren:Und ich folgte diesem Code:
Was für mich gut funktioniert hat:
Iris stellte Randhistogramme Streudiagramm ein
quelle
shape = 19
inggscatter
. Codes für Formen hierMit ggstatsplot können Sie auf einfache Weise attraktive Streudiagramme mit Randhistogrammen erstellen (es passt auch zu einem Modell und beschreibt es):
Oder etwas ansprechender (standardmäßig) ggpubr :
AKTUALISIEREN:
Wie von @aickley vorgeschlagen, habe ich die Entwicklungsversion verwendet, um den Plot zu erstellen.
quelle
Dies ist eine alte Frage, aber ich dachte, es wäre nützlich, hier ein Update zu veröffentlichen, da ich kürzlich auf dasselbe Problem gestoßen bin (danke an Stefanie Mueller für die Hilfe!).
Die am besten bewertete Antwort mit gridExtra funktioniert, aber das Ausrichten von Achsen ist schwierig / hackig, wie in den Kommentaren ausgeführt wurde. Dies kann jetzt mit dem Befehl ggMarginal aus dem Paket ggExtra gelöst werden:
quelle
Ich habe diese Optionen ausprobiert, war aber mit den Ergebnissen oder dem unordentlichen Code, den man verwenden müsste, um dorthin zu gelangen, nicht zufrieden. Zum Glück hat Thomas Lin Pedersen gerade ein Paket namens Patchwork entwickelt , das die Arbeit auf ziemlich elegante Weise erledigt.
Wenn Sie ein Streudiagramm mit Randhistogrammen erstellen möchten, müssen Sie diese drei Diagramme zunächst separat erstellen.
Sie müssen nur noch diese Diagramme mit einem einfachen hinzufügen
+
und das Layout mit der Funktion festlegenplot_layout()
.Die Funktion
plot_spacer()
fügt der oberen rechten Ecke ein leeres Diagramm hinzu. Alle anderen Argumente sollten selbsterklärend sein.Da Histogramme stark von der gewählten Binbreite abhängen, könnte man argumentieren, Dichtediagramme zu bevorzugen. Mit einigen kleinen Modifikationen würde man zB für Eye-Tracking-Daten eine schöne Darstellung bekommen.
Obwohl die Daten zu diesem Zeitpunkt noch nicht bereitgestellt werden, sollten die zugrunde liegenden Prinzipien klar sein.
quelle
Um auf der Antwort von @ alf-pascu aufzubauen, bietet das manuelle Einrichten und Anordnen jedes Diagramms
cowplot
viel Flexibilität sowohl in Bezug auf das Haupt- als auch in das Randdiagramm (im Vergleich zu einigen anderen Lösungen). Ein Beispiel ist die Verteilung nach Gruppen. Das Ändern des Hauptdiagramms in ein Diagramm mit 2D-Dichte ist ein weiteres.Im Folgenden wird ein Streudiagramm mit (richtig ausgerichteten) Randhistogrammen erstellt.
Um stattdessen ein Diagramm mit 2D-Dichte zu zeichnen, ändern Sie einfach das Hauptdiagramm.
quelle
Eine andere Lösung mit
ggpubr
undcowplot
, aber hier erstellen wir Diagramme mitcowplot::axis_canvas
und fügen sie dem ursprünglichen Diagramm hinzu mitcowplot::insert_xaxis_grob
:quelle
Heutzutage gibt es mindestens ein CRAN-Paket, das das Streudiagramm mit seinen Randhistogrammen erstellt.
quelle
Sie können die interaktive Form von
ggExtra::ggMarginalGadget(yourplot)
Boxplots, Violinplots, Dichtediagrammen und Histogrammen verwenden und ganz einfach zwischen diesen wählen.so wie das
quelle