Erstellen Sie in ggplot2 eine Matrix aus Streudiagrammen (Paare () äquivalent)

117

Ist es möglich , mit einer Matrix von Streudiagramme zu zeichnen ggplot2, mit ggplot‚s netten Features wie die Abbildung zusätzliche Faktoren Farbe, Form usw. und das Hinzufügen von glattem?

Ich denke über etwas Ähnliches wie die baseFunktion nach pairs.

Karsten W.
quelle
17
Schauen Sie sich auch ggally
hadley
1
Ah, ich habe deinen Kommentar dort nicht gesehen, Hadley. Ich habe meine Antwort CW gemacht, um Ihren
Kredit

Antworten:

37

Vielleicht möchten Sie plotmatrix ausprobieren:

  library(ggplot2)
  data(mtcars)
  plotmatrix(mtcars[,1:3])

Für mich sollte mpg (erste Spalte in mtcars) kein Faktor sein. Ich habe es nicht überprüft, aber es gibt keinen Grund, warum es einer sein sollte. Allerdings bekomme ich ein Streudiagramm :)


Hinweis: Zum späteren Nachschlagen wurde die plotmatrix()Funktion durch die ggpairs()Funktion aus dem GGallyPaket ersetzt, wie @ naught101 in einer anderen Antwort auf diese Frage unten vorschlägt .

Matt Bannert
quelle
Ich konnte Facettierung nicht dazu bringen, an diesem Problem zu arbeiten. Es scheint, dass Faktoren auf der rechten Seite der Formel erforderlich sind. Oder können Sie mir ein minimales Beispiel geben?
Karsten W.
1
Weiß jemand, wie man Farbe hinzufügt? Ich scheine nicht in der Lage zu sein, dieses gist.github.com/1405150 zum Laufen zu bringen
Etienne Low-Décarie
1
Der erste Teil dieser Antwort ist falsch und sorgt für Verwirrung. Sie können keine Paardiagramme mit Facettierung erstellen: Sie können y nur nach x-Diagrammen erstellen und sie nach Faktoren gruppieren. Mit anderen Worten, mit Facettierung haben Sie auf jedem Unterplot das gleiche x und y; Bei Paaren haben Sie in jeder Spalte ein anderes x und in jeder Zeile ein anderes y.
naught101
28
Zum späteren Nachschlagen wurde die plotmatrix()Funktion durch die ggpairs()Funktion aus dem GGallyPaket ersetzt, wie @ naught101 in einer anderen Antwort auf diese Frage vorschlägt.
Smillig
1
@MattBannert hat den Kommentar zu Ihrem Beitrag hinzugefügt, um ihn besser sichtbar zu machen. Ich könnte die Downvoter verstehen, wenn ich das Lesen der Kommentare übersprungen hätte. Hoffe es macht dir nichts aus.
zx8754
232

Ich möchte das immer wieder tun, aber Plotmatrix ist Mist. Hadley empfiehlt stattdessen die Verwendung des GGally-Pakets . Es hat eine Funktion, ggpairs , die ein stark verbessertes Paardiagramm darstellt (Sie können nicht kontinuierliche Variablen in Ihren Datenrahmen verwenden). Abhängig von den Variablentypen werden in jedem Quadrat unterschiedliche Diagramme dargestellt:

library(GGally)
ggpairs(iris, aes(colour = Species, alpha = 0.4))

Geben Sie hier die Bildbeschreibung ein

naught101
quelle
26
Das ist wirklich toll. Es ist erwähnenswert, dass jede colourVariable ein Faktor sein muss; verbrachte 45 Minuten damit, das herauszufinden.
Gregmacfarlane
1
Gibt es eine Möglichkeit, diese Korrelationsmatrizen ohne Paare zu zeichnen? Zum Beispiel muss ich die erste Spalte gegen jede andere Spalte zeichnen. Gppa ergibt ein sehr mögliches Paar. Zum Beispiel habe ich 10 Spalten und es gibt mir 10 * 10 = 100. Aber ich will nur 1. Spalte gegen andere 9 nur
Rgeek
1
@Rgeek: Sie können meltden Datenrahmen mithilfe der Variablen, an der Sie interessiert sind, als ID-Variable verwenden und dann anhand der anderen Variablen facettieren.
Naught101
6
Verwenden Sie keine ggpairs, sondern nur ggplot2 wie ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). Ich gehe davon aus, dass Sie über Streudiagramme sprechen, wenn Sie "Korrelationsdiagramm" sagen, weil ich sonst noch nie davon gehört habe.
naught101
3
@ JimGreen GGally::ggpairs(iris, aes(colour = Species, alpha=0.4))
ElBaulP
17

Wenn man ein ggplotObjekt erhalten möchte (nicht ggmatrixwie im Fall von ggpairs()), besteht die Lösung darin, die Daten zweimal zu schmelzen, dann ggplotmit Facettierung. facet_wrapwäre besser als facet_gridbei der Begrenzung der aufgetragenen Fläche, wenn der scales = 'free'Parameter angegeben wird.

require(ggplot2) 
require(dplyr)
require(tidyr)

gatherpairs <- function(data, ..., 
                        xkey = '.xkey', xvalue = '.xvalue',
                        ykey = '.ykey', yvalue = '.yvalue',
                        na.rm = FALSE, convert = FALSE, factor_key = FALSE) {
  vars <- quos(...)
  xkey <- enquo(xkey)
  xvalue <- enquo(xvalue)
  ykey <- enquo(ykey)
  yvalue <- enquo(yvalue)

  data %>% {
    cbind(gather(., key = !!xkey, value = !!xvalue, !!!vars,
                 na.rm = na.rm, convert = convert, factor_key = factor_key),
          select(., !!!vars)) 
  } %>% gather(., key = !!ykey, value = !!yvalue, !!!vars,
               na.rm = na.rm, convert = convert, factor_key = factor_key)
}

iris %>% 
  gatherpairs(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) %>% {
  ggplot(., aes(x = .xvalue, y = .yvalue, color = Species)) +
      geom_point() + 
      geom_smooth(method = 'lm') +
      facet_wrap(.xkey ~ .ykey, ncol = length(unique(.$.ykey)), scales = 'free', labeller = label_both) +
      scale_color_brewer(type = 'qual')
}

Geben Sie hier die Bildbeschreibung ein

mjktfw
quelle