2010-08-23 4 views
27

Ich suche nach einer einfacheren Möglichkeit, die kumulative Verteilungslinie in ggplot zu zeichnen.Einfachere Möglichkeit, die kumulative Häufigkeitsverteilung in ggplot zu plotten?

Ich habe einige Daten, dessen Histogramm kann ich sofort angezeigt mit

qplot (mydata, binwidth=1); 

ich einen Weg gefunden, es zu http://www.r-tutor.com/elementary-statistics/quantitative-data/cumulative-frequency-graph zu tun, aber es beinhaltet mehrere Schritte, und wenn Daten zu erkunden, es ist zeitaufwendig.

Gibt es eine Möglichkeit, es in ggplot einfacher zu machen, ähnlich wie Trendlinien und Konfidenzintervalle durch Angabe von Optionen hinzugefügt werden können?

Antwort

23

Es gibt eine eingebaute ecdf() Funktion in R, die die Dinge erleichtern sollte. Hier ist ein Beispielcode, unter Verwendung plyr

library(plyr) 
data(iris) 

## Ecdf over all species 
iris.all <- summarize(iris, Sepal.Length = unique(Sepal.Length), 
          ecdf = ecdf(Sepal.Length)(unique(Sepal.Length))) 

ggplot(iris.all, aes(Sepal.Length, ecdf)) + geom_step() 

#Ecdf within species 
iris.species <- ddply(iris, .(Species), summarize, 
          Sepal.Length = unique(Sepal.Length), 
          ecdf = ecdf(Sepal.Length)(unique(Sepal.Length))) 

ggplot(iris.species, aes(Sepal.Length, ecdf, color = Species)) + geom_step() 

bearbeiten Ich habe erkannt, dass Sie Summen wollen. Sie können das bekommen, indem Sie den ECDF Wert durch die Gesamtzahl der Beobachtungen Multiplikation:

iris.all <- summarize(iris, Sepal.Length = unique(Sepal.Length), 
          ecdf = ecdf(Sepal.Length)(unique(Sepal.Length)) * length(Sepal.Length)) 

iris.species <- ddply(iris, .(Species), summarize, 
          Sepal.Length = unique(Sepal.Length), 
          ecdf = ecdf(Sepal.Length)(unique(Sepal.Length))*length(Sepal.Length)) 
+0

Dies ist eine großartige Antwort, aber ich kann eine Sache nicht ganz herausfinden. Im 'ecdf (Sepal.Length) (unique (Sepal.Length))' bit, was ist los? Ich verstehe, dass es konkrete Werte aus dem "ecdf" -Objekt extrahiert, aber ich kann mich nicht erinnern, jemals diese (x) (y) -Notation gesehen zu haben ... kannst du mir helfen, das zu verstehen? Vielen Dank! –

+3

@MattParker 'ecdf()' gibt eine Funktion zurück, so dass die Notation die zurückgegebene Funktion an den eindeutigen Werten von 'Sepal.Length' auswertet. –

+0

@GavinSimpson Verstanden, danke! –

20

Noch einfacher:

qplot(unique(mydata), ecdf(mydata)(unique(mydata))*length(mydata), geom='step') 
+0

Cool, aber so prägnant, dass es mir schwer fällt, in einen ggplot-Befehl zu übersetzen, mit dem ich Titel- und Achsenbeschriftungen festlegen kann. – dfrankow

+0

Ich nehme an, ich kann main, xlab, ylab verwenden. – dfrankow

+0

Ich wünschte, ich könnte zweimal upvoten, ich bin mehr als einmal hierher zurückgekommen. – dfrankow

46

Die neue Version von ggplot2 (0.9.2.1) verfügt über eine integrierte in stat_ecdf() Funktion wodurch Sie kumulative Verteilungen sehr einfach darstellen können.

qplot(rnorm(1000), stat = "ecdf", geom = "step") 

Oder

df <- data.frame(x = c(rnorm(100, 0, 3), rnorm(100, 0, 10)), 
      g = gl(2, 100)) 
ggplot(df, aes(x, colour = g)) + stat_ecdf() 

Codebeispiele aus ggplot2 Dokumentation.