2010-08-23 11 views
27

Poszukuję łatwiejszego sposobu narysowania skumulowanej linii dystrybucji w ggplot.Łatwiejszy sposób na wykreślenie skumulowanego rozkładu częstotliwości w ggplot?

Mam pewne dane, którego histogram mogę natychmiast wyświetlić z

qplot (mydata, binwidth=1); 

znalazłem sposób, aby to zrobić w http://www.r-tutor.com/elementary-statistics/quantitative-data/cumulative-frequency-graph ale obejmuje kilka etapów i podczas odkrywania danych jest czasochłonne.

Czy można to zrobić w bardziej prosty sposób w ggplot, podobnie jak linie trendu i przedziały ufności można dodać, określając opcje?

Odpowiedz

23

Jest wbudowana funkcja ecdf() w R, która powinna ułatwić to zadanie. Oto niektóre przykładowy kod, wykorzystując 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() 

Edit Właśnie uświadomiłem sobie, że chcesz skumulowaną częstotliwość. można dostać się poprzez pomnożenie wartości ecdf przez całkowitą liczbę obserwacji:

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

To jest świetna odpowiedź, ale jest jedna rzecz, której nie mogę zrozumieć. W "ecdf (Sepal.Length) (unikalny (Sepal.Length)) bit, co się dzieje? Rozumiem, że to wyodrębnianie konkretnych wartości z obiektu 'ecdf', ale nie pamiętam, aby kiedykolwiek widziałem tę notację (x) (y) przed ... Czy możesz mi pomóc to zrozumieć? Dzięki! –

+3

@MattParker 'ecdf()' zwraca funkcję, dzięki czemu notacja analizuje zwróconą funkcję przy unikalnych wartościach 'Sepal.Length'. –

+0

@GavinSimpson Got it, thanks! –

20

Jeszcze prościej

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

Fajnie, ale tak zwięźle, mam trudny czas tłumacząc na komendę ggplot, której mogę użyć do ustawienia tytułu i etykiet osi. – dfrankow

+0

Przypuszczam, że mogę użyć main, xlab, ylab. – dfrankow

+0

Żałuję, że nie mogłem dwukrotnie głosować, wróciłem tu więcej niż jeden raz. – dfrankow

46

Nowa wersja ggplot2 (0.9.2.1) ma wbudowaną funkcję stat_ecdf() co pozwala ci łatwo wykreślić skumulowane rozkłady.

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

Albo

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() 

próbki kodu z dokumentacji ggplot2.

Powiązane problemy