Was ist ein guter Weg, um mit R ein Streudiagramm zu erstellen, das die Daten nach Behandlung trennt?

30

Ich bin sehr neu in Bezug auf R und Statistiken im Allgemeinen, aber ich muss ein Streudiagramm erstellen, von dem ich denke, dass es über seine ursprünglichen Kapazitäten hinausgeht.

Ich habe ein paar Vektoren von Beobachtungen und möchte mit ihnen ein Streudiagramm erstellen, und jedes Paar fällt in eine von drei Kategorien. Ich möchte ein Streudiagramm erstellen, das jede Kategorie entweder nach Farbe oder nach Symbol trennt. Ich denke, das wäre besser, als drei verschiedene Streudiagramme zu erzeugen.

Ich habe ein weiteres Problem mit der Tatsache, dass es in jeder der Kategorien große Cluster an einem Punkt gibt, aber die Cluster in einer Gruppe größer sind als in den beiden anderen.

Kennt jemand einen guten Weg, dies zu tun? Pakete, die ich installieren und verwenden lernen sollte? Hat jemand etwas ähnliches gemacht?

Vielen Dank

crf
quelle

Antworten:

53

Große Cluster : Wenn Überdrucken ein Problem darstellt, können Sie entweder ein niedrigeres Alpha verwenden, sodass einzelne Punkte schwach sind. Durch Überdrucken werden jedoch intensivere Farben erzeugt. Oder Sie wechseln zu 2D-Histogrammen oder Dichteschätzungen.

require ("ggplot2")
  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, colour = Species)) + stat_density2d ()
    Dichte
    Sie würden wahrscheinlich dies facettieren wollen ...

  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, fill = Species)) + stat_binhex (bins=5, aes (alpha = ..count..)) + facet_grid (. ~ Species)
    hexbin
    Während Sie diese Handlung auch ohne Facetten erstellen können, beeinflusst die Reihenfolge der Arten das endgültige Bild.

  • Sie können dies vermeiden, wenn Sie bereit sind, sich die Hände ein wenig schmutzig zu machen (= Link zu Erklärung und Code) und gemischte Farben für die Sechsecke berechnen: Bildbeschreibung hier eingeben

  • Eine weitere nützliche Funktion ist die Verwendung von (Hex) -Behältern für Bereiche mit hoher Dichte und die Darstellung einzelner Punkte für andere Teile:

    ggplot (df, aes (x = date, y = t5)) + 
      stat_binhex (data = df [df$t5 <= 0.5,], bins = nrow (df) / 250) +
          geom_point (data = df [df$t5 > 0.5,], aes (col = type), shape = 3) +
      scale_fill_gradient (low = "#AAAAFF", high = "#000080") +
      scale_colour_manual ("response type", 
        values = c (normal = "black", timeout = "red")) + 
      ylab ("t / s")
    

    Bildbeschreibung hier eingeben


Lassen Sie mich der Vollständigkeit halber noch erwähnen lattice:

require ("lattice")
  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Spezies, Iris, pch = 20) </ code>

  • xyplot(Sepal.Width ~ Sepal.Length, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length, Iris, groups = Iris $ Species, pch = 20) </ code>

  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Spezies, Iris, Gruppen = Iris $ Spezies, pch = 20) </ code>

cbeleites unterstützt Monica
quelle
Schön! Vielen Dank, die Hex-Behälter haben den Trick perfekt gemacht!
crf
22

Dies ist eines der klassischen Probleme für den 'Iris'-Datensatz. Dies ist ein Link zu einer Reihe von Plotprojekten, die auf diesem Datensatz mit R-Code basieren und die Sie möglicherweise an Ihr Problem anpassen können.

Hier ist ein Ansatz, der mit Base R anstelle eines Add-On-Pakets verwendet wird.

plot(iris$Petal.Length, iris$Petal.Width, pch=21, 
     bg=c("red","green3","blue")[unclass(iris$Species)], 
     main="Edgar Anderson's Iris Data")

was diese Figur erzeugt:

Bildbeschreibung hier eingeben

Abhängig von Ihrem Plot können Sie nun mit Alpha / Transparenz-Levels experimentieren, um ein Überplotten usw. zu ermöglichen, aber ich würde zuerst von einem sehr einfachen Graphen aufbauen.

Während es viele Gründe gibt, an der Basis R festzuhalten, vereinfachen andere Pakete das Plotten. Die Trennung von Daten durch ein Unterscheidungsmerkmal ist eine der Stärken der Pakete ggplot2 und lattice . ggplot2 macht besonders optisch ansprechende Plots. Beide Pakete werden in der Antwort von @cbeleites gezeigt.

Fomite
quelle
4
Etwas verwirrend, weil Sie ggplot2 in Ihrem Beispiel nicht verwenden, obwohl Sie es empfehlen? Ein ggplot2-Äquivalent wäre eine Bibliothek (ggplot2); qplot (Blütenblattlänge, Blütenblattbreite, Farbe = Spezies, Daten = Iris, Haupt = "Edgar Andersons Irisdaten"). Dies hat auch den Vorteil, dass automatisch eine Legende erstellt wird.
Peter Ellis
@PeterEllis Das liegt daran, dass ich zwar etwas erkennen kann, das sich gut für ggplot2 eignet, aber ich bin nur passiv kompetent mit den Basisgrafiken.
Fomite
1
Toller Trick mit unclass () in der Basisgrafik BTW
Peter Ellis
16

Oder mit ggplot2:

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour = Species)) + geom_point()
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + facet_grid(~Species)

Welches produziert

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Roman Luštrik
quelle