2013-02-27 13 views
5

i einen Datenrahmen haben all, die wie folgt aussehen:R - Erstellen von Streudiagramm von Datenrahmen

http://pastebin.com/Xc1HEYyH

Jetzt möchte ich ein Streudiagramm mit den Spaltenüberschriften in der x-Achse erzeugen und die jeweiligen Werte als die Datenpunkte. Zum Beispiel:

7|     x 
6|   x  x 
5| x  x  x  x  
4| x  x   x 
3|        x  x 
2|        x  x 
1| 
--------------------------------------- 
    STM STM STM PIC PIC PIC 
    cold normal hot cold normal hot 

Dies sollte einfach sein, aber ich kann nicht herausfinden, wie.

Grüße

Antwort

8

Die Grundidee, wenn Sie ggplot2 mit Hadleys plotten möchten Ihre Daten in der Form zu erhalten:

 x   y 
col_names  values 

Und dies kann reshape2 unter Verwendung melt Funktion von Hadleys erfolgen. Machen Sie ?melt, um die möglichen Argumente zu sehen. Doch hier, da wir die ganze data.frame schmelzen wollen, brauchen wir nur,

melt(all) 
# this gives the data in format: 
# variable value 
# 1 STM_cold 6.0 
# 2 STM_cold 6.0 
# 3 STM_cold 5.9 
# 4 STM_cold 6.1 
# 5 STM_cold 5.5 
# 6 STM_cold 5.6 

Hier x wird dann Spalte variable und y wird value Spalte werden entsprechend.

require(ggplot2) 
require(reshape2) 
ggplot(data = melt(all), aes(x=variable, y=value)) + 
      geom_point(aes(colour=variable)) 

Wenn Sie nicht die Farben wollen, dann entfernen Sie einfach aes(colour=variable) innen geom_point, so dass es geom_point() wird.

enter image description here

Edit: ich wohl hier erwähnen sollte, dass Sie auch geom_point mit geom_jitter ersetzen könnte, dass Sie geben werde, na ja, jittered Punkte:

enter image description here

+0

Dank, das ist großartig. Gibt es eine Möglichkeit, für jeden der verschiedenen Werte der x-Achse eine andere Form einzustellen? – user1192748

+0

ja, benutze 'shape = variable' innerhalb' aes' wie 'colour'. – Arun

+2

+1. Ich bin kein normaler ggplot2-Benutzer, daher ist es immer schön, die Alternativen zu sehen, die usersR zur Verfügung stehen. Ein paar Kritiken, obwohl. Erstens, ist in diesem Fall eine Legende wirklich notwendig? Ich sehe keinen Mehrwert für dieses spezielle Beispiel. Gäbe es weitere Gruppierungen * in * jeder Variablen, könnte es sinnvoll sein, verschiedene Farben oder Formen und eine Legende zu haben. Zweitens, ist es möglich, den Jitter ein wenig mehr zu kontrollieren? Ich finde es etwas ablenkend, wie das Zittern große Löcher für einige der Variablen hinterlässt, aber andere eher geclustert erscheinen lässt. – A5C1D2H2I1M1N2O1R2T1

5

Hier sind zwei Optionen zu berücksichtigen. Die erste verwendet dotplot aus dem "Gitter" -Paket:

library(lattice) 
dotplot(values ~ ind, data = stack(all)) 

enter image description here

Die zweite benutzt dotchart von der Basis R "Grafiken" Optionen. Um die dotchart Funktion zu nutzen, müssen Sie Ihre data.frame in as.matrix wickeln:

dotchart(as.matrix(all), labels = "") 

Beachten Sie, dass die Punkte in dieser Grafik sind nicht „Jitterbasierten“, sondern stellte sie in der Reihenfolge aufgezeichnet wurden. Das heißt, der tiefste Punkt ist der erste Datensatz und der höchste Punkt ist der letzte Datensatz. Wenn Sie das Diagramm für dieses Beispiel vergrößern, sehen Sie, dass Sie 16 sehr schwache horizontale Linien haben. Jede Zeile repräsentiert eine Zeile aus jeder Spalte. Wenn Sie sich also die Punkte für "STM_cold" oder eine der anderen Variablen mit den Werten NA ansehen, sehen Sie oben einige leere Zeilen, in denen keine Daten verfügbar waren.

Dies hat seine Vorteile, da es einen zeitlichen Trend anzeigen kann, wenn die Werte chronologisch aufgezeichnet werden. Es kann aber auch ein Nachteil sein, wenn der Quelldatenrahmen zu viele Zeilen enthält.

enter image description here

3

Ein bisschen einer manuellen Version Grafik Basis R nur zum Spaß mit.

die Daten holen:

test <- read.table(text="STM_cold STM_normal STM_hot PIC_cold PIC_normal PIC_hot 
6.0 6.6 6.3 0.9 1.9 3.2 
6.0 6.6 6.5 1.0 2.0 3.2 
5.9 6.7 6.5 0.3 1.8 3.2 
6.1 6.8 6.6 0.2 1.8 3.8 
5.5 6.7 6.2 0.5 1.9 3.3 
5.6 6.5 6.5 0.2 1.9 3.5 
5.4 6.8 6.5 0.2 1.8 3.7 
5.3 6.5 6.2 0.2 2.0 3.5 
5.3 6.7 6.5 0.1 1.7 3.6 
5.7 6.7 6.5 0.3 1.7 3.6 
NA NA NA 0.1 1.8 3.8 
NA NA NA 0.2 2.1 4.1 
NA NA NA 0.2 1.8 3.3 
NA NA NA 0.8 1.7 3.5 
NA NA NA 1.7 1.6 4.0 
NA NA NA 0.1 1.7 3.7",header=TRUE) 

das Grundstück ein:

plot(
    NA, 
    ylim=c(0,max(test,na.rm=TRUE)+0.3), 
    xlim=c(1-0.1,ncol(test)+0.1), 
    xaxt="n", 
    ann=FALSE, 
    panel.first=grid() 
    ) 

axis(1,at=seq_along(test),labels=names(test),lwd=0,lwd.ticks=1) 

Plot einig Punkte, mit einiger x-Achse jitter ing so werden sie auf aufeinander nicht gedruckt.

invisible(
    mapply(
     points, 
     jitter(rep(seq_along(test),each=nrow(test))), 
     unlist(test), 
     col=rep(seq_along(test),each=nrow(test)), 
     pch=19 
     ) 
) 

Ergebnis:

enter image description here

bearbeitet

Hier ist ein Beispiel an den Punkten Alpha-Transparenz verwenden und die jitter loszuwerden, wie in den Kommentaren unten mit Ananda diskutiert.

invisible(
    mapply(
     points, 
     rep(seq_along(test),each=nrow(test)), 
     unlist(test), 
     col=rgb(0,0,0,0.1), 
     pch=15, 
     cex=3 
     ) 
) 

enter image description here

+0

+1, dachte ich ursprünglich an etwas mit Stripcharts mit Jitter, aber dann fiel mir ein, dass ein Punktdiagramm mir getrennte Punkte zeigen würde, die * nicht * jitterten, sondern die Reihenfolge, in der sie im Datensatz erscheinen. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto - Es war dein Punktdiagramm, das diesen Versuch inspirierte. Ich denke, eine andere Option, die mir gerade in den Sinn kam, wäre, die Punkte mit einer niedrigen Deckkraft zu plotten (mit rgba Farbwerten) und das Jitter zu beseitigen. – thelatemail

+0

Ich dachte mir das als solche aus, also habe ich meine Antwort aktualisiert, um zu reflektieren, dass die Antwort tatsächlich nicht * jitterte. Ich mag die Idee, einen Alpha-Kanal in irgendeiner Weise ohne das Zittern zu verwenden. Oder verwenden Sie offene Formen (nicht gefüllt) zusammen mit Transparenz. – A5C1D2H2I1M1N2O1R2T1

Verwandte Themen