2010-08-23 3 views
27

Я ищу более простой способ нарисовать кумулятивную линию распределения в ggplot.Простой способ построения кумулятивного распределения частот в ggplot?

У меня есть некоторые данные, чьи гистограммы можно сразу отобразить с

qplot (mydata, binwidth=1); 

Я нашел способ сделать это в http://www.r-tutor.com/elementary-statistics/quantitative-data/cumulative-frequency-graph, но она включает в себя несколько этапов и при изучении данных, это отнимает много времени.

Есть ли способ сделать это более простым способом в ggplot, аналогично тому, как линии тренда и доверительные интервалы могут быть добавлены путем указания опций?

ответ

23

В R есть встроенная функция ecdf(), которая должна облегчить ситуацию. Вот некоторые примеры кода, используя 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() 

Редактировать Я просто понял, что вы хотите, суммарная частота. Вы можете получить, что путем умножения значения ecdf на общее число наблюдений:

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

Это отличный ответ, но есть одна вещь, которую я не могу понять. В бит 'ecdf (Sepal.Length) (уникальный (Sepal.Length)), что происходит? Я понимаю, что он извлекает конкретные значения из объекта 'ecdf', но я не помню, чтобы когда-либо видел это (x) (y) нотацию раньше ... можете ли вы помочь мне понять это? Благодаря! –

+3

@MattParker 'ecdf()' возвращает функцию, так что нотация оценивает возвращаемую функцию с уникальными значениями 'Sepal.Length'. –

+0

@GavinSimpson Получил это, спасибо! –

20

Еще проще:

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

Прохладный, но так лаконичный Мне сложно перевести команду ggplot, которую я могу использовать, чтобы установить метки заголовка и оси. – dfrankow

+0

Я полагаю, что могу использовать main, xlab, ylab. – dfrankow

+0

Жаль, что я мог бы удвоить, я вернулся сюда не один раз. – dfrankow

46

Новая версия ggplot2 (0.9.2.1) имеет встроенную функцию stat_ecdf() которые позволяют легко строить кумулятивные распределения.

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

Или

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

Образцы кода из ggplot2 документации.

Смежные вопросы